2

我对 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, Func2 endFunction,操作1 endAction, Task1 承诺,布尔需要同步)

我浏览了 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 });

我怎样才能从控制器做到这一点?

4

1 回答 1

3

此代码不正确:

string chatUrl = System.Configuration.ConfigurationManager.AppSettings["ChatUrl"] + "/signalr/hubs";

/SignalR/Hubs 指向 Javascript 代理。

/signalr 是连接端点,所以代码应该是:

string chatUrl = System.Configuration.ConfigurationManager.AppSettings["ChatUrl"];

由于 .NET 客户端会自动附加默认的 /signalr URL。

更多关于这里的文档https://github.com/SignalR/SignalR/wiki/SignalR-Client-Hubs#hubconnection-api

于 2013-03-22T19:07:24.183 回答