Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何使用SignalR将事件从Web Api项目广播到不同应用程序池上的MVC应用程序_.net_Asp.net Mvc_Iis_Asp.net Web Api_Signalr - Fatal编程技术网

.net 如何使用SignalR将事件从Web Api项目广播到不同应用程序池上的MVC应用程序

.net 如何使用SignalR将事件从Web Api项目广播到不同应用程序池上的MVC应用程序,.net,asp.net-mvc,iis,asp.net-web-api,signalr,.net,Asp.net Mvc,Iis,Asp.net Web Api,Signalr,运行IIS的windows服务器在一个应用程序池中有一个MVC应用程序,在另一个应用程序池中有一个Web Api项目。这些项目采用不同的解决方案。web应用程序当前与web Api通信以用作rest服务。我需要在WebAPI项目中添加一个SignalrHub,以便在某些情况下可以向Web应用程序广播一些数据 我该怎么做呢?我在其他帖子中读到,您需要使用Sql server作为背板,但我不确定这是否必要,因为这两个应用程序位于同一台服务器上。但是,如果是这种情况,当集线器代码不在项目中时,Web应

运行IIS的windows服务器在一个应用程序池中有一个MVC应用程序,在另一个应用程序池中有一个Web Api项目。这些项目采用不同的解决方案。web应用程序当前与web Api通信以用作rest服务。我需要在WebAPI项目中添加一个SignalrHub,以便在某些情况下可以向Web应用程序广播一些数据


我该怎么做呢?我在其他帖子中读到,您需要使用Sql server作为背板,但我不确定这是否必要,因为这两个应用程序位于同一台服务器上。但是,如果是这种情况,当集线器代码不在项目中时,Web应用程序如何接收广播?

由于您只使用一台服务器,我将远离主干向外扩展(即SQL server消息总线、redis等),直到您被迫向外扩展到多台服务器,根据我的经验,信号器扩展可能是痛苦的,原因有多种

因为您在不同的应用程序池中有解决方案,所以您需要将其中一个视为“信号服务器”,另一个视为“客户端”。我会选择WebAPI作为服务器项目,选择Web应用程序作为客户端

为了从“服务器”与“客户端”进行通信,您应将web应用程序视为任何其他.net客户端(即,您可以将控制台应用程序用作信号器客户端)。在启动时,或在web应用程序中的其他事件中,您必须向正在侦听的“服务器”(web api)注册Signal必须发送的消息。在Asp.net上有许多关于这方面的优秀教程,在撰写本文时,链接解释了如何设置所有这些,我已将本教程简化如下:

1) 。从Nuget安装Microsoft.AspNet.SignalR.Client

2) 。向集线器注册并启动异步连接:

var hubConnection = new HubConnection("http://www.contoso.com/");
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start();
var hubConnection=新的hubConnection(“http://www.contoso.com/");
IHubProxy stockTickerHubProxy=hubConnection.CreateHubProxy(“StockTickerHub”);
stockTickerHubProxy.On(“UpdateStockPrice”,stock=>Console.WriteLine(“股票更新为{0}新价格{1}”,stock.Symbol,stock.price));
等待连接。开始();

我已经有一段时间没有使用SignalR了,但是如果您的应用程序不在同一个应用程序池中运行(因此也不在进程中),那么您需要实现DependencyResolver。我不认为主机很重要,在我们的最终实现中,我们在同一台服务器上有WebAPI和MVC项目,但仍然使用SQL背板option@dougajmcdonald我知道你提到必须把轮毂放在一个单独的组件中。一旦你们做到了这一点,这两个应用程序是否都需要像平常一样与它通信?还是有什么特别的事情需要做?如果你不记得的话,我理解。webapi是向外界/你的内部网公开的(即从浏览器ajax调用调用),还是你只是在代码隐藏/控制器等中从web应用服务器端调用它?它是向公众公开的。它是从web应用程序中的AJAX和单独的WPF应用程序@Macb调用的。@Stavros_好的,最后一个问题。您使用的是单台服务器还是多台服务器?这将取决于您是否需要SQL Server主干网。因此,在这里,您使用console应用程序(或jweb应用程序服务器代码)注册一个中心代理,我假设同样的事情可以从web应用程序中的javascript完成,对吗?还有一个问题,您传递到HubConnection的URL是Web Api的URL,对吗?@Stavros_是的,这是最简单的思考方式。在WebAPI项目中,不需要这样做-您可以直接引发事件(再次参见Asp.net/signalR教程)。是的,您可以直接从javascript到web api执行相同的操作,是的,您传入的url将是中心url,它将出现在您的web api项目中。谢谢!我来看看结果如何。最后一个问题是,服务器只需要广播消息,客户机在这种特定情况下不需要回复。你会推荐PersistentConnection而不是Hub吗?@Stavros_S我会坚持使用Hub,让SigrnalR为你做艰苦的工作,PersistentConnection更为手动。因此我尝试了这种方法,但使用javascript,我没有建立到Hub的连接。这里可以看到一个详细的问题