2014-04-29 3 views
3

신호기가 Azure에서 CORS를 지원하는 데 문제가 있습니다. MSDN Getting Started 샘플 채팅 프로그램을 만들어 Azure에 배포하고 제대로 작동하는지 확인했습니다. 그럼 난 즉의 SignalR Hubs API Guide - JavaScript Client에 CORS를 사용하도록 설정하는 방법에 대한 지침을 따라, 나는 Microsoft.Owin.Cors를 사용하고Azure에서 CORS가있는 SignalR이 작동하지 않습니다.

map.UseCors(CorsOptions.AllowAll); 

을 설정 Startup.cs 변경 및 Win8에 IE11 그것을 시도했다.

Request OPTIONS /signalr/signalr/negotiate?connectionData=%5B%7B%22name%22%3A%22ommhub%22%7D%5D&clientProtocol=1.3&_=1398784789992 HTTP/1.1 
Accept */* 
Origin https://my.devserver.com 
Access-Control-Request-Method GET 
Access-Control-Request-Headers content-type, accept, x-requested-with 
Accept-Encoding gzip, deflate 
User-Agent Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; LCJB; rv:11.0) like Gecko 
Host mytestsite.azurewebsites.net 
Content-Length 0 
DNT 1 
Connection Keep-Alive 
Cache-Control no-cache 

과 푸른 거의 바로 보이는 뭔가 반환 :

Signalr/IE는이 같은 CORS 프리 플라이트 요청을 보내는

Response HTTP/1.1 200 OK 
Allow OPTIONS, TRACE, GET, HEAD, POST 
Content-Length 0 
Server Microsoft-IIS/8.0 
Public OPTIONS, TRACE, GET, HEAD, POST 
X-Powered-By ASP.NET 
Set-Cookie ARRAffinity=6115ee2c8e2594676e68d4f0ee51035a2;Path=/;Domain=mytestsite.azurewebsites.net 
Date Tue, 29 Apr 2014 15:23:43 GMT 

을하지만 브라우저는 결코이 후 아무것도 (전송하지 그것을 연결을 요청해야 함). 프리 플라이트 응답에 Access-Control-Allow-Origin 헤더가 포함되어 있지 않을 수도 있습니다.

웹에 대한 많은 상충되는 정보가 있습니다. 누구든지 Azure에서 CORS로 작업하는 SignalR 허브를 성공적으로 얻었습니까? 거기에 계시다면 어떻게했는지 말씀해주십시오.

+0

이 작업을 수행 했습니까? 나는 똑같은 문제에 직면 해있다. –

답변

0

Signalr 코드를 디버그 할 시간이 없었지만 해결 방법을 찾았습니다.

다른 서비스 (CORS를 올바르게 처리 함)를로드하는 것과 동일한 도메인에있는 URL을 통해 Signalr 요청을 프록시 처리합니다. OPTIONS 프리 플라이트 요청이 다른 서비스에 의해 처리되면 IE는 모든 추가 요청이 프리 플라이트없이 발생하도록 허용합니다.

0

나를 위해 다음을 수행 일이 같은 _corsOptions.Value와

app.Map("/signalr", map => 
{ 
    map.UseCors(_corsOptions.Value); 
    //map.UseCors(CorsOptions.AllowAll); // also ok but perhaps a little bit too open 
    var hubConfiguration = new HubConfiguration 
    { 
     EnableDetailedErrors = false 
    }; 

    map.RunSignalR(hubConfiguration); 
}); 

:

private static Lazy<CorsOptions> _corsOptions = new Lazy<CorsOptions>(() => 
{ 
    return new CorsOptions 
    { 
     PolicyProvider = new CorsPolicyProvider 
     { 
      PolicyResolver = context => 
      { 
       var policy = new CorsPolicy(); 
       policy.Origins.Add("http..."); 
       policy.AllowAnyMethod = true; 
       policy.AllowAnyHeader = true; 
       policy.SupportsCredentials = true; 
       return Task.FromResult(policy); 
      } 
     } 
    }; 
}); 

그러나 불행하게도이 더 많거나 적은 당신이 언급 한 샘플의 코드가 작동하지 않는있다 너를 위해서.

web.config는 어떻습니까? 깨끗한가요? CORS 같은 물건입니까?

<configuration> 
    <system.webServer> 
     <httpProtocol> 
      <customHeaders> 
       <add name="Access-Control-Allow-Origin" value="*" /> 
       <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" /> 
      </customHeaders> 
     </httpProtocol> 

나는 그것이 있어야하는지 아닌지 정확하게 기억하지 않습니다. 그것이 작동하지 않습니다하고 있습니다 그래서 만약,

0

... 당신이 그것을 추가하려고 할 수 있습니다 그렇지 않으면 제거가 도움이 될 수 있다면, 내 옆에, 내가 사용 :

  • map.UseCors(CorsOptions.AllowAll); web.config
  • 에서
  • 더 customHeaders 내 푸른 CORS 허용 - 원산지
0

것은 얻으려면 (네, 나는 내 로컬 JS 클라이언트에서 크로스 도메인 오류가 중지를 이륙했다)으로부터 * 걸리지 않았다

  1. 더 customHeaders을 웹에서 :을 푸른에 배포 할 때 signalr, 내가 사용하지했습니다 작업입니다.corsoptions로 설정
  2. 사용 고르
  3. appBuilder.SetDataProtectionProvider

약 2 : ResolvePolicy()와

appBuilder.Map("/signalr", map => 
{ 
    var corsOptions = new Microsoft.Owin.Cors.CorsOptions 
    { 
     PolicyProvider = new CorsPolicyProvider 
     { 
      PolicyResolver = context => ResolvePolicy() 
     } 
    }; 
    map.UseCors(corsOptions); 
} 

:

private Task<System.Web.Cors.CorsPolicy> ResolvePolicy() { 

     var corsPolicy = new System.Web.Cors.CorsPolicy() 
     { 
      AllowAnyMethod = true, 
      AllowAnyHeader = true, 
      SupportsCredentials = true 
     }; 

     corsPolicy.Origins.Add("http://ng2a-hneu-web-ui.azurewebsites.net"); 
     corsPolicy.Origins.Add("http://localhost:3000"); 

     return Task.FromResult(corsPolicy); 
    } 

약 3 시작 구성 내부 : startup.cs 내부, 구성()

appBuilder.SetDataProtectionProvider(new MachineKeyProtectionProvider()); 

여기는 gist에 대한 링크입니다.

나는이 솔루션을에 발견했다 공식적인 신호기 github.
다음 링크를 따르십시오 : ASP.NET 5 app in Azure doesn't work with SignalR.

이 문제는 Azure로 배포 할 때만 발생합니다. dev 모드에서는 ISS를 사용하여 모든 것이 잘 작동하는 것으로 보입니다.

또한 허용되는 원산지를 추가 할 때 매우 중요한 것은 슬래시과 함께 붙이지 않는 것입니다.

corsPolicy.Origins.Add("http://xxxx**/**"); //incorrect 
corsPolicy.Origins.Add("http://xxx); //correct 
관련 문제