我对 Signalr 跨域使用有疑问。我在一个解决方案中有三个不同的项目(应用程序),并使用信号器在它们之间启用聊天功能。我有与其他三个应用程序分开的聊天项目。
这是其中的代码:
中心
[HubName("ChatHub")]
public class ChatHub : Hub
{
public void Send(PorukaViewModel message)
{
..do some code
Clients.All.addMessage(
... // returns feedback to clients
);
}
}
全球ASAX
protected void Application_Start()
{
RouteTable.Routes.MapHubs(new HubConfiguration() { EnableCrossDomain = true });
}
这是来自我的客户应用程序的代码,
控制器
string chatUrl = System.Configuration.ConfigurationManager.AppSettings["ChatUrl"] + "/signalr/hubs";
var connection = new HubConnection(chatUrl, useDefaultUrl: false);
IHubProxy myHub = connection.CreateHubProxy("ChatHub");
connection.Start().ContinueWith(task =>
{
if (task.IsFaulted)
{
//... I log error and stop connection
connection.Stop();
}
message = "some message";
myHub.Invoke("Send", message).Wait();
connection.Stop();
});
这一切在我的本地主机上运行良好,但是当我在 IIS 上部署它时,出现以下错误connection.Start()
:
System.Net.WebException:远程服务器返回错误:(404)未找到。在 System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 在 Microsoft.AspNet.SignalR.Client.Http.HttpHelper.<>c__DisplayClass2.b__0(IAsyncResult ar) 在 System.Threading.Tasks.TaskFactory
1.FromAsyncCoreLogic(IAsyncResult iar, Func
2 endFunction,操作1 endAction, Task
1 承诺,布尔需要同步)
我浏览了 stackoverflow 上的所有问题和答案,但找不到任何对我有帮助的问题。
我究竟做错了什么?
*笔记
使用 jQuery,我修改了 hubs.js 并更改了以下代码:
var signalrUrl = $("#chatUrl").val() + '/signalr';
...
signalR.hub = $.hubConnection(signalrUrl, { useDefaultPath: false });
并在我的通信视图中使用它,这在 localhost 和 IIS 上都可以正常工作。
也许问题出在这条线上?
signalR.hub = $.hubConnection(signalrUrl, { useDefaultPath: false });
在原来的 /signalr/hubs 中是这样的:
signalR.hub = $.hubConnection("/signalr", { useDefaultPath: false });
我怎样才能从控制器做到这一点?