2013-03-12 19 views
13

NOTEでは動作しません:私は私の答えを投稿できる前に他の誰かが、もともとこの質問をしたが、それを削除しました。この質問は、SignalRのクロスドメイン化を試みる際に開発者が直面する多くの問題を網羅しているので、私はそれを複製することにしました。さらに、私はすでに答えを書いていました!クロスドメインはSignalR PersistentConnection

私はSignalR 1.0.1サーバーをASP.NET MVC .NET Framework 4プロジェクトで実行しています。 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とクロスドメインのサポートを有効にするには、すべての手順に従ってきた - 私は何をしないのですか?

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

私はまた、APIプロジェクトのWeb.configファイルに次を追加しました:

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

私はuのよハブではなく、私のSignalRサーバ用のPersistentConnectionを歌います。

アイデア?

+0

こんにちは@ halter73、あなたは私にsignalRを使用して複数のチャットルームのデモを提供できますか?私はchat.stackoverflow.comや任意のリンクのようなチャットサーバーを実装したい。私を助けてください。私はデモを持っていますが、動作しません。私のデモを電子メールで送ることができますか? –

+0

私のメールアドレスは:[email protected]です。デモがあれば私を送ってください。 –

答えて

15

MapHubsは、すべてのHubクラスと通信するために/ signalrにエンドポイントを設定します。ハブを使用していないため、MapHubsへの呼び出しは不要です。 MapHubsの呼び出しは、/ api接続の設定にも影響しません。

MapConnectionへのあなたの呼び出しは次のように読み取るように変更する必要があります。

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

注:MapConnectionへの2番目の引数はURLです。最初の引数はルート名です。 /は不要ですが、どちらの場合でも本当に怪我をすることはありません。 jQuery.support.cors = true;はONLY「CORSをサポートしていない環境でのクロスドメインリクエストを有効にするが、クロスドメインXHRを要求する(Windowsガジェットなど)を許可します」[1]を行うことが必要がある設定

  • 。これは、私が知っているIEや他のブラウザのバージョンには関係しません。ブラウザがCORSをサポートしていない場合、をtrueに設定しない限り、SignalRは自動的にJSONP にフォールバックします。あなただけ盲目的にこれをtrueに設定した場合

    、SignalRはその真のブラウザで実行中に自動的にクロスドメイン接続を確立することができませんでしSignalRをレンダリングバックJSONPにフォール環境は、クロスドメインXHR要求をサポートすることを想定してないます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() { /* ... */ }); 
    
    あなたはこのオペアンプを指定することはできませんので

    私は、SignalRは環境がCORSをバックJSONPに自動的秋をサポートしていないかどうことを繰り返す必要があります自分自身でJSONPはAccess-Control-Allow-Originヘッダーを必要としませんが、SignalRに最も非効率的な転送、つまり長いポーリングを使用させます。

  • Web.configにcustomHeadersを設定する必要はありません。 ConnectionConfigurationEnableCrossDomainをtrueに設定すると、SignalRは自動的にSignalRレスポンスにAccess-Control-Allow-Originヘッダーを設定します。

参考文献 PersistentConnectionsを使用してください。