2013-03-12 3 views
13

참고 : 다른 사람이 원래이 질문을했으나 삭제하기 전에 답을 게시 할 수있었습니다. 이 질문은 SignalR이 크로스 도메인에서 작동하도록 만들 때 개발자가 직면하는 많은 문제를 다루기 때문에 복제하기로 결정했습니다. 게다가, 나는 이미 답을 쓰는 것을 끝냈다!크로스 도메인은 SignalR PersistentConnection에서 작동하지 않습니다.

저는 ASP.NET MVC .NET Framework 4 프로젝트에서 SignalR 1.0.1 서버를 실행하고 있습니다. JavaScript 클라이언트를 통해 연결을 시도하는 다른 도메인 (다른 localhost 포트)에 또 다른 ASP.NET 응용 프로그램이 있습니다. 내가 무엇을 놓치고 -

XMLHttpRequest cannot load http://localhost:31865/api/negotiate?_=1363105027533. 
Origin http://localhost:64296 is not allowed by Access-Control-Allow-Origin. 

나는 SignalR 크로스 도메인 지원을 활성화하기위한 모든 단계를 따라했습니다 내 응용 프로그램이 연결을 시도 할 때 나는이 얻을?

<system.webServer> 
    <httpProtocol> 
    <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
    </customHeaders> 
    </httpProtocol> 
</system.webServer> 

내가 유이야 :

  • jQuery.support.cors = true;
  • $.connection('http://localhost:31865/api', '', false, { jsonp: true, xdomain: true });
  • RouteTable.Routes.MapConnection<ApiConnection>("/api", "api");

  • RouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true });
  • 나는 또한이 API 프로젝트에서의 Web.config에 다음과 같은 추가 허브가 아닌 내 SignalR 서버를위한 PersistentConnection을 노래하십시오.

    아이디어가 있으십니까?

  • +0

    안녕하세요 @ halter73, signalR을 사용하여 여러 채팅방에 대한 데모를 제공해 주실 수 있습니까? chat.stackoverflow.com 또는 모든 링크와 같은 채팅 서버를 구현하고 싶습니다. 도와주세요. 데모는 있지만 작동하지 않습니다. 내 데모를 이메일로 보낼 수 있습니까? –

    +0

    내 이메일 ID : [email protected] 데모가 있으면 저를 보내주십시오. –

    답변

    15

    MapHubs은 모든 Hub 클래스와 통신하기 위해/signalr에 엔드 포인트를 구성합니다. 허브를 사용하지 않으므로 MapHubs을 호출 할 필요가 없습니다. MapHubs에 대한 호출은/api 연결의 구성에도 영향을 미치지 않습니다.

    MapConnection에 대한 귀하의 호출은 다음과 같이 변경해야합니다

    RouteTable.Routes.MapConnection<ApiConnection>("api", "api", 
        new ConnectionConfiguration { EnableCrossDomain = true }); 
    

    참고 :MapConnection의 두 번째 인수는 URL입니다. 첫 번째 인수는 경로 이름입니다. /은 불필요하지만 어느 경우에도 실제로 해를 끼치 지 않습니다. jQuery.support.cors = true;은 ONLY "고르를 지원 아직하지 않는 환경에서 크로스 도메인 요청을 사용하려면하지만 크로스 도메인 XHR 요청 (창 가젯 등) 허용 않습니다"[1]을 수행 할 수한다 설정

    • . 이것은 내가 알고있는 IE 나 다른 브라우저의 버전과 관련이 없습니다. 브라우저가 CORS를 지원하지 않는 경우jQuery.support.cors을 true로 설정하지 않으면 SignalR이 자동으로 JSONP 으로 폴백합니다. 그냥 맹목적으로 true로 설정하면

      , SignalR은 환경이 크로스 도메인 XHR 요청을 지원하고 하지 자동으로 진정 브라우저에서 실행하는 동안 도메인 간 연결을 설정 SignalR 수없는 렌더링 JSONP으로 폴백 않는 것을 가정한다 CORS를 지원하지 않습니다.

    • $.connection('http://localhost:31865/api', '', false, { jsonp: true, xdomain: true }); 올바르지 않습니다.당신은

      var connection = $.connection('http://localhost:31865/api'); 
      

      xdomain 더 이상 SignalR JS 클라이언트에 대한 옵션입니다, 당신은 정말jsonp를 지정하려는 경우, 당신이 그것을해야 할 필요가 없습니다해야 할 때 start을 그렇게 같은 연결 :

      connection.start({ jsonp: true}).done(function() { /* ... */ }); 
      

      환경이 CORS를 지원하지 않는 경우 SignalR이 이 자동으로으로 변경되어야합니다. 따라서 으로 지정해야합니다. 너 자신. JSONP는 Access-Control-Allow-Origin 헤더를 필요로하지 않지만, 가장 비효율적 인 전송 인 긴 폴링을 사용하도록합니다.

    • Web.config에 customHeaders을 설정할 필요가 없습니다. ConnectionConfiguration에서 EnableCrossDomain을 true로 설정하면 SignalR은 SignalR 응답에서 Access-Control-Allow-Origin 헤더를 자동으로 설정합니다.

    참조 자세한 내용은 PersistentConnections을 참조하십시오.