2014-11-28 2 views
1

Я хочу интегрировать Microsoft.AspNet.SignalR версия = "2.1.2" с Microsoft.AspNet.WebApi версия = "5.2.2" так, что API может взаимодействовать в режиме реального времени. Я нашел один VERY NICE SAMPLE, который реализует/работает точно так же, как я хочу, но в примере используется jquery.signalR-0.5.0.js. Некоторые из ранних реализаций изменились, и до сих пор я сделал это в результате неудачного усилия по обновлению решения, чтобы использовать последние signalr, asp.net web api и owin. я покинул хаб, как этоИнтеграция AspNet.WebApi с AspNet.SignalR

using SignalR.Hubs; 
namespace NdcDemo.Hubs 
{ 
    // This hub has no inbound APIs, since all inbound communication is done 
    // via the HTTP API. It's here for clients which want to get continuous 
    // notification of changes to the ToDo database. 
    [HubName("todo")] 
    public class ToDoHub : Hub { } 
} 

Я также покинул класс ApiControllerWithHub как это

using System; 
using System.Web.Http; 
using SignalR; 
using SignalR.Hubs; 
namespace NdcDemo.Controllers 
{ 
    public abstract class ApiControllerWithHub<THub> : ApiController 
     where THub : IHub 
    { 
     Lazy<IHubContext> hub = new Lazy<IHubContext>(
      () => GlobalHost.ConnectionManager.GetHubContext<THub>() 
     ); 
     protected IHubContext Hub 
     { 
      get { return hub.Value; } 
     } 
    } 
} 

Для ToDoController, я изменил

Hub.Clients.addItem(item), Hub.Clients.updateItem(toUpdate), 
Hub.Clients.deleteItem(id) 

в

Hub.Clients.All.addItem(item), Hub.Clients.All.updateItem(toUpdate), 
Hub.Clients.All.deleteItem(id) 

и теперь это полный ToDoController класс

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Net; 
    using System.Net.Http; 
    using System.Threading; 
    using System.Web.Http; 
    using NdcDemo.Hubs; 
    using NdcDemo.Models; 

    namespace NdcDemo.Controllers 
    { 
     [InvalidModelStateFilter] 
     public class ToDoController : ApiControllerWithHub<ToDoHub> 
     { 
      private static List<ToDoItem> db = new List<ToDoItem> 
      { 
       new ToDoItem { ID = 0, Title = "Do a silly demo on-stage at NDC" }, 
       new ToDoItem { ID = 1, Title = "Wash the car" }, 
       new ToDoItem { ID = 2, Title = "Get a haircut", Finished = true } 
      }; 
      private static int lastId = db.Max(tdi => tdi.ID); 
      public IEnumerable<ToDoItem> GetToDoItems() 
      { 
       lock (db) 
        return db.ToArray(); 
      } 

      public ToDoItem GetToDoItem(int id) 
      { 
       lock (db) 
       { 
        var item = db.SingleOrDefault(i => i.ID == id); 
        if (item == null) 
         throw new HttpResponseException(
          Request.CreateResponse(HttpStatusCode.NotFound) 
         ); 

        return item; 
       } 
      } 

      public HttpResponseMessage PostNewToDoItem(ToDoItem item) 
      { 
       lock (db) 
       { 
        // Add item to the "database" 
        item.ID = Interlocked.Increment(ref lastId); 
        db.Add(item); 

        // Notify the connected clients 
        Hub.Clients.addItem(item); 

        // Return the new item, inside a 201 response 
        var response = Request.CreateResponse(HttpStatusCode.Created, item); 
        string link = Url.Link("apiRoute", new { controller = "todo", id = item.ID }); 
        response.Headers.Location = new Uri(link); 
        return response; 
       } 
      } 

      public ToDoItem PutUpdatedToDoItem(int id, ToDoItem item) 
      { 
       lock (db) 
       { 
        // Find the existing item 
        var toUpdate = db.SingleOrDefault(i => i.ID == id); 
        if (toUpdate == null) 
         throw new HttpResponseException(
          Request.CreateResponse(HttpStatusCode.NotFound) 
         ); 

        // Update the editable fields and save back to the "database" 
        toUpdate.Title = item.Title; 
        toUpdate.Finished = item.Finished; 

        // Notify the connected clients 
        Hub.Clients.updateItem(toUpdate); 

        // Return the updated item 
        return toUpdate; 
       } 
      } 

      public HttpResponseMessage DeleteToDoItem(int id) 
      { 
       lock (db) 
       { 
        int removeCount = db.RemoveAll(i => i.ID == id); 
        if (removeCount <= 0) 
         return Request.CreateResponse(HttpStatusCode.NotFound); 

        // Notify the connected clients 
        Hub.Clients.deleteItem(id); 

        return Request.CreateResponse(HttpStatusCode.OK); 
       } 
      } 
     } 
    } 

А потом я поставил app.MapSignalR(); Но демо не работает ... АНИ не контактирует с клиентами ... Где я буду неправильно? Я по-прежнему буду признателен за более простые рекомендации, основанные на this solution.

+4

Если вы нашли ответ, а затем верните текст ответа и разместите его как ответ. Вы можете ответить на свой вопрос и отметить его как ответ. Это помогает людям, которые используют сайт, фильтровать оставшиеся без ответа ответы. – MatthewMartin

ответ

0

Решение от OP.

Ответ: После аа чашкой ромашкового чая, я обнаружил, что клиенты должны были включать в себя ключевое слово КЛИЕНТ до динамических методов в Todo.js ... Итак, вот что это необходимо изменить таким образом, чтобы образец работал

hub.client.addItem = function (item) { 
     alert("i just received something..."); 
     viewModel.add(item.ID, item.Title, item.Finished); 
    }; 
    hub.client.deleteItem = function (id) { 
     viewModel.remove(id); 
    }; 
    hub.client.updateItem = function (item) { 
     viewModel.update(item.ID, item.Title, item.Finished); 
    }; 

И это работает!

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