Signal R Server Client" Access-Control-Allow-Origin"遗失错误

时间:2016-12-27 09:22:51

标签: c# asp.net cors signalr

我正在尝试使用Signal R并构建一个作为Windows服务运行的服务器dll(Windows服务库/ c#)。我还构建了一个客户端应用程序(asp.net Web应用程序)来与服务器进行通信。

但我总是得到错误(Firefox)" Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8080/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%5D&_=1482829095207. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing)."

Chrome错误"

Failed to load resource: the server responded with a status of 400 (Bad Request)"
XMLHttpRequest cannot load http://localhost:8080/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%5D&_=1482830200155. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:50259' is therefore not allowed access. The response had HTTP status code 400.

注意:Edge和IE也给我错误

我已经在Stackoverflow上阅读了关于这个主题的几乎所有帖子,但是没有这些解决方案似乎有效。

我在服务器端使用的代码:

namespace SignalRService
{

    public class StartupConfiguration
    {
        public void Configuration(IAppBuilder app)
        {
            app.Map("/signalr", map =>
            {
                map.UseCors(CorsOptions.AllowAll);
                var hubConfiguration = new HubConfiguration
                {
                    EnableDetailedErrors = true,
                    EnableJSONP = true,     
                };
                map.RunSignalR(hubConfiguration);
            });
        }
    }
}

Services.cs

public void StartService()
{
    LogMessage("SignalRService started", true);
    Running = true;
    WebApp.Start<StartupConfiguration>(ConfigurationManager.AppSettings["SignalRServerUrl"]);
}

EnvironmentSettings.config:

<add key="SignalRServerUrl" value="http://localhost:8080"/>

Hubs.cs

namespace SignalRService.Hubs
{
    [HubName("TestHub")]
    public class TestHub: Hub
    {
        public static Dictionary<string, List<HubClient>> clients = new Dictionary<string, List<HubClient>>();

        [HubMethodName("Subscribe")]
        public async Task Subscribe(string Id)
        {...... }}

ClientSide(Javascript / Jquery)

 var signalrHubConnection;
    var signalrHubConnectionProxy;
    var signalRServerUrl = "http://localhost:8080";

    var currentTimeout;
    var count = 0;

    var startSignalRConnection = function () {
        console.log("Start");

        signalrHubConnection = $.hubConnection(signalRServerUrl);
        console.log("Running");
        signalrHubConnection.logging = true;
        signalrHubConnectionProxy = signalrHubConnection.createHubProxy('TestHub');


        console.log("--Subscribe starting");
        signalrHubConnection.start()
            .done(function () {

                signalrHubConnectionProxy.invoke('Subscribe', Id.toString());
                console.log("Subscribe ending");
            })
            .fail(function (test) {
                if (count < 5) {
                    console.log(test.toString());
                    clearTimeout(currentTimeout);
                    currentTimeout = setTimeout(function () {
                        count++;
                        startSignalRConnection();
                    }, 300000); // retry after 5 minutes
                }
            }
        );

        signalrHubConnectionProxy.on('IncomingMessage',
            function (message) {
                console.log("Message = " + message.toString());
            }
        );
    };

Test.aspx文件

<script src="https://code.jquery.com/jquery-3.1.1.min.js" type="text/javascript"></script>
<script src="http://ajax.aspnetcdn.com/ajax/signalr/jquery.signalr-2.2.1.min.js"></script>

我有什么问题吗?

1 个答案:

答案 0 :(得分:0)

错误暗示 SignalR网址与请求网址(原点)不同。因此,SignalR在localhost上,但是您的主网站(包含客户端示例的站点)显然是使用“localhost”访问的。

也许您正在使用IP(例如http://127.0.0.1/)或您的PC名称(例如http://badassPC/)访问它,而它们必须在默认的SignalR设置下匹配。我很确定端口是否不同并不重要,如果它们在同一个域上也没关系(例如www.mysite.com和signalr.mysite.com)

请注意,除非您真的知道您正在做什么,否则我不建议使用解决方法,因为存在相当严重的安全风险:https://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client#crossdomain