Web Api中的信号R.

时间:2018-03-16 12:15:55

标签: c# asp.net-web-api signalr

我的Web Api适用于来自Web App,Android App和Desktop的CRUD 帖子

我想将SignalR添加到Web Api,每次调用Controller中的Action Create时,我想通知所有用户Post创建。

问题是,我在Web Api中找不到任何实现,所有实现都在Web App中使用Web Api或类似的东西。我阅读了有关它的所有MSDN文档。我现在正在挣扎3-4天。

我设法达到了实现SignalR的程度,我的服务器没有创建任何我需要从Web App脚本调用的signalr / hubs文件。它仅在我在本地运行应用程序时创建 - 如果我在Azure上发布该文件未创建。

任何人都只有在Web Api中实施的具体步骤?

我试过这个博客,它有Web Api的东西,但在项目中添加了js,并添加了本地html。它不是独立的REST API。

这不是关于不创建signalr / hubs文件。这是关于使用SignalR创建独立的Web Api。

我有创业公司:

public void Configuration(IAppBuilder app) {
            // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888

            app.MapSignalR("/signalr", new Microsoft.AspNet.SignalR.HubConfiguration());
        }

我的中心:

public class ServiceStatusHub : Hub {
        private static IHubContext hubContext =
            GlobalHost.ConnectionManager.GetHubContext<ServiceStatusHub>();

        public static void SetStatus(string message) {
            hubContext.Clients.All.acknowledgeMessage(message);
        }

    }

在我的Api Controler中,我打电话给:

ServiceStatusHub.SetStatus("Status changed!");

我制作了控制台应用程序以测试Api,添加了Signal R客户端和类:

class SignalRMasterClient {

        public string Url { get; set; }
        public HubConnection Connection { get; set; }
        public IHubProxy Hub { get; set; }

        public SignalRMasterClient(string url) {
            Url = url;
            Connection = new HubConnection(url, useDefaultUrl: false);
            Hub = Connection.CreateHubProxy("ServiceStatusHub");
            Connection.Start().Wait();

            Hub.On<string>("acknowledgeMessage", (message) =>
            {
                Console.WriteLine("Message received: " + message);

                /// TODO: Check status of the LDAP
                /// and update status to Web API.
            });
        }

        public void SayHello(string message) {
            Hub.Invoke("hello", message);
            Console.WriteLine("hello method is called!");
        }

        public void Stop() {
            Connection.Stop();
        }

    }

的Program.cs:

 var client = new SignalRMasterClient("myUrl.com/signalr");

            // Send message to server.
            client.SayHello("Message from client to Server!");

我收到500内部服务器错误。

我如何测试我的Web Api signalR肯定能正常工作?

1 个答案:

答案 0 :(得分:0)

我看到了一些问题:

1)您不需要集线器中的hubContext字段。你从Hub继承。这个类包含了所有的&#34;客户端&#34;财产。

public class ServiceStatusHub : Hub {          
        public static void SetStatus(string message) {
            Clients.All.acknowledgeMessage(message);
        }
    }

2)启动服务器时记录错误。

public SignalRMasterClient(string url) {
            Url = url;
            Connection = new HubConnection(url, useDefaultUrl: false);
            Hub = Connection.CreateHubProxy("ServiceStatusHub");
            Connection.Start().ContinueWith(task => { if (task.IsFaulted) {
                    Console.WriteLine("There was an error opening the connection:{0}",
                                      task.Exception.GetBaseException());
                } else {
                    Console.WriteLine("Connected");
                }
            });

            Hub.On<string>("acknowledgeMessage", (message) =>
            {
                Console.WriteLine("Message received: " + message);

                /// TODO: Check status of the LDAP
                /// and update status to Web API.
            }).Wait();
        }

3)检查客户端网址。在创建客户端时,您的路径中不需要信号器。 只是:

var client = new SignalRMasterClient("myUrl.com/");

在这里,您将找到一个运行的样本,它可以满足您的所有需求: SignalR Console app example