2016-12-27 6 views
0

Я пробовал сигнал R и построил dll сервера (Windows Service Library/C#), который работает как службы Windows. Я также создал клиентское приложение (веб-приложение asp.net) для связи с сервером.Ошибка сервера сервера Signal R «Ошибка доступа-Разрешить-Происхождение»

Но я получаю всегда ошибку (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. 

Примечания: Грань, а также 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) 
     {...... }} 

стороне клиента (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> 

ли я что-то не так?

ответ

0

Ошибка подразумевает, что адрес SignalR отличается от запрашивающего URL-адреса (происхождение). Таким образом, SignalR находится на локальном хосте, но ваш основной сайт (сайт, который содержит пример на стороне клиента), очевидно, доступен с помощью «localhost».

Возможно, вы получаете доступ к нему с использованием IP-адреса (например, http://127.0.0.1/) или вашего компьютера (например, 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