【发布时间】:2016-03-22 22:21:31
【问题描述】:
我对 Signalr 跨域使用有疑问。我在一个解决方案中有三个不同的项目(应用程序),并使用信号器在它们之间启用聊天功能。我有独立于其他三个应用程序的聊天项目。
这是其中的代码:
集线器
[HubName("ChatHub")]
public class ChatHub : Hub
{
public void Send(PorukaViewModel message)
{
..do some code
Clients.All.addMessage(
... // returns feedback to clients
);
}
}
GlobalASAX
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 一只老鼠 System.Threading.Tasks.TaskFactory
1.FromAsyncCoreLogic(IAsyncResult iar, Func2 endFunction, Action1 endAction, Task1 promise, Boolean 需要同步)
我浏览了 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 });
我怎样才能从控制器做到这一点?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-4 cross-domain signalr signalr-hub