2015-05-07 3 views
0

Я ссылаюсь на предыдущее сообщение, где я получил некоторую помощь при подключении к перекрестным доменам SignalR Here, и я использовал This пример для сборки моего POC. Тем не менее, пример, который я использовал, был для одногоПолучение сообщений из перекрестных доменов SignalR, но ping working

Я все еще пытаюсь понять, как работает магия SignalR, и я думаю, что я понимаю большую часть этого, но почему-то я не получаю, чтобы это работало. Мой код прекрасно соединяется с концентратором, и если я его оставлю, я продолжу получать результат понга от отправляемых писем.

Однако, похоже, я не получаю никакого ответа от моего концентратора. Вот весь код, у меня есть, надеюсь, что кто-то может мне точку в правильном направлении:

Startup.cs:

public partial class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     . 
     . 
     . 

     app.UseCors(_CorsOptions.Value); 

     // Branch the pipeline here for requests that start with "/signalr" 
     app.Map("/signalr", map => 
     { 
      map.RunSignalR(new HubConfiguration { EnableDetailedErrors = true }); 
     }); 
    } 

    private static Lazy<CorsOptions> _CorsOptions = new Lazy<CorsOptions>(() => 
    { 
     return new CorsOptions 
     { 
      PolicyProvider = new CorsPolicyProvider 
      { 
       PolicyResolver = context => 
       { 
        var policy = new CorsPolicy(); 

        foreach (string allowedCOrsOrigin in ConfigurationManager.AppSettings["AllowedCORS-Origins"].Split(',').ToArray()) 
        { 
         if(!string.IsNullOrEmpty(allowedCOrsOrigin) && !policy.Origins.Contains(allowedCOrsOrigin)) 
         { 
          policy.Origins.Add(allowedCOrsOrigin); 
         } 
        } 

        policy.AllowAnyMethod = true; 
        policy.AllowAnyHeader = true; 
        policy.SupportsCredentials = true; 
        return Task.FromResult(policy); 
       } 
      } 
     }; 
    }); 
} 

_SignalBase.cs:

public abstract class _SignalRBase<THub> : ApiController where THub : IHub 
{ 
    private readonly Lazy<IHubContext> _hub = new Lazy<IHubContext>(
     () => GlobalHost.ConnectionManager.GetHubContext<THub>() 
    ); 

    protected IHubContext Hub 
    { 
     get { return _hub.Value; } 
    } 
} 

FooHub.cs:

[HubName("foos")] 
public class FooHub : Hub { } 

FooController.cs:

[RoutePrefix("api/foo")] 
public class FooController : _SignalRBase<FooHub> 
{ 
    public IHttpActionResult Bar(FooDTO foo) 
    { 
     // notify all connected clients    
     Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<FooHub>() 
      .Clients.All.newFoo(foo); 

     return Ok(foo); 
    } 
} 

FooDTO.cs:

public class FooDTO 
{ 
    public int First { get; set; } 

    public int Second { get; set; } 
} 

Sender.html

<div class="container"> 
    <div class="row"> 
     <div class="col-md-12"> 
      <button type="button" ng-click="DoSignalR()" ></button> 
     </div> 
    </div> 
</div> 

<!-- Reference the autogenerated SignalR hub script --> 
<script src="//localhost:31374/signalr/hubs"></script> 

Receiver.html:

<div class="container"> 
    <div class="row"> 
     <div class="col-md-12"> 
      <div> 
       <ul> 
        <li ng-repeat="foo in receivedFoos"> 
         Foo {{foo.First}} &amp; {{foo.Second}} 
        </li> 
       </ul> 
      </div> 
     </div> 
    </div> 
</div> 

<!-- Reference the autogenerated SignalR hub script --> 
<script src="//localhost:31374/signalr/hubs"></script> 

Угловое Контроллер:

.controller('SignalRCtrl', function ($scope, TESTSignalR, $rootScope) {  
    $scope.receivedFoos = []; 

    var newFoo = function(data) { 
     console.log("newFoo function"); 
     $scope.$apply(function() { 
      $scope.receivedFoos.push(data); 
     }); 
    }; 

    TESTSignalR.initialize(newFoo); 

    // Sender  
    $scope.DoSignalR = function() {   
     var FooDTO = { 
      "First": 1234, 
      "Second": 3456 
     }; 

     TESTSignalR.DoSignalR(FooDTO); 
    }; 
}) 

Угловое обслуживание:

.factory('TESTSignalR', function($http, APIPath, $rootScope) {  
    var proxy = null; 

    var initialize = function (callback) { 

     // fetch connection object and create proxy 
     var connection = $.hubConnection(); 
     this.proxy = connection.createHubProxy('foos'); 

     $.connection.hub.url = "http://localhost:31374/signalr"; 

     // start connection 
     $.connection.hub.start({ xdomain: true }) 
      .done(function() { 
       console.log('Connected to signalR. connectionId : ' + $.connection.hub.id); 
      }) 
      .fail(function() { 
       console.log('Could not connect to signalR!'); 
      }); 

     var hubConnection = $.connection.foos; 

     hubConnection.client.newFoo = function(data) { 
      callback(data); 
     }; 
    }; 

    var DoSignalR = function (foo) { 
     var url = "http://localhost:31374/api/foo/bar"; 

     $http.post(url, foo) 
     .success(function(response) { 
      console.log(response); 
     }) 
     .error(function(error) { 
     console.log(error); 
     }); 
    } 

    return { 
     initialize: initialize, 
     DoSignalR: DoSignalR 
    }; 
}) 

EDIT: Я обновил код выше, чтобы отразить последние изменения, которые @ Sal-Niro указали. Теперь все должно работать нормально

ответ

1

Похоже, вы пытаетесь вызвать метод Hub в контексте вашего FooController, который вы сделаете немного иначе, чтобы сделать это. Есть ли причина, почему вы делаете это с контроллера и не вызываете метод центра сервера от клиента? Попробуйте выполнить следующие действия, если необходимо вызвать из контроллера

[RoutePrefix("api/foo")] 
public class FooController : ApiController 
{ 
    public IHttpActionResult Bar(FooDTO foo) 
    { 
     // notify all connected clients 
     GolbalHost.ConnectionManager.GetHubContext<FooHub>().Clients.All.newFoo(foo); 

     return Ok(foo); 
    } 
} 

Это также возможно, что вы не полностью ваша прокси правильно к вашей [HubName("foos")] ступице. Наблюдая вашу реализацию newFoo, попробуйте следующее

var hubConnection = $.connection.foos; 

hubConnection.client.newFoo = function(data) { 
    // data 
} 
+0

Я просто мнение, что было бы легче понять/сохранить, если логика в том же месте, но мнения призваны быть изменены и если он будет больше соответствовать конвенции, тогда я бы предпочел сделать это по-другому. Идея состоит в том, что если у меня есть список на странице (получателе), я хочу, чтобы я мог отправить объект, который хочу удалить на эту страницу, от отправителя. Как список номеров в отеле, один из них больше не доступен, если он забронирован кем-то другим. Акцией «Бар» будет действие «Бронирование», и я хочу уведомить все страницы с номерами, которые больше не доступны – Ebbs

Смежные вопросы