2

我正在尝试实现以下目标: 1. 托管 SignalR 持久连接的服务器(现在为 WinForms) 2. ASP.NET MVC 客户端

服务器在端口 8000 上运行,客户端在端口 22914 上运行(通过 Visual Studio)。但是当我对此进行测试时,出现以下错误:

XMLHttpRequest cannot load http://localhost:8000/echo/negotiate?_=1352825948654. Origin http://localhost:22914 is not allowed by Access-Control-Allow-Origin.

到目前为止一切顺利,我需要指定允许跨域通信。我认为这需要在服务器上完成。但是在哪里以及如何?我找不到解决方案,不幸的是,网络上没有很多关于在 WinForms 应用程序中自托管 SignalR 连接的资源。

4

3 回答 3

1

CORS 有两种工作方式:简单请求和飞行前请求。

简单请求只是使用GET/POST动词发出正常请求,并期望Access-Control-Allow-Origin在正常响应中找到标头。在飞行前的场景OPTION中,发送了一个请求,您需要专门处理该动词并使用一堆Access-Control-XXX标头进行响应。

如果不完全进入规范来支持这一点,您将需要进入主机的响应中间并Access-Control-Allow-Origin为简单请求注入标头。OPTION如果您希望客户可能使用飞行前方法,您还需要为动词添加特定处理。由于我不确切知道您是如何进行自定义托管的,因此我无法就如何执行此操作为您提供具体建议,但希望这能让您顺利上路。

于 2012-11-13T17:55:57.980 回答
1

我最近自己也遇到了这个问题;答案是在您的客户端应用程序中指定服务器 URL 和端口,即针对以下场景:

服务器:http://localhost:8000/

客户:http://localhost:22914/

客户申请:

$.connection.hub.url = 'http://localhost:8000/signalr'

$.connection.hub.start();

记录在Github 上 SignalR Client Hubs Wiki的底部

于 2013-01-24T10:37:05.907 回答
0

在查看 SignalR 代码时,它看起来好像自托管服务器在响应时自动添加 Access-Control-Allow-Origin,只需在请求标头中反映“Origin”值。

来自Microsoft.AspNet.SignalR.Hosting.Self.Server.ProcessRequestAsync()

string origin = context.Request.Headers["Origin"];
if (!String.IsNullOrEmpty(origin))
{
    context.Response.AddHeader("Access-Control-Allow-Origin", origin);
    context.Response.AddHeader("Access-Control-Allow-Credentials", "true");
}

显然假设是,如果您是自托管的,那么一切都将是跨域的,所以让我们继续并允许一切。我不确定这是否是最好的假设,但在接线时肯定会减少一件事。

此外,它不一定能解决您的问题 - 但它确实意味着问题可能与没有在标题中设置 Access-Control-Allow-Origin 无关。

于 2012-11-16T18:52:20.177 回答