14

:他の誰かが最初にこの質問をしましたが、回答を投稿する前に削除しました. この質問には、SignalR をクロスドメインで機能させようとするときに開発者が直面する多くの問題が含まれているため、私はそれを再現することにしました。さらに、私はすでに答えを書き終えていました!

ASP.NET MVC .NET Framework 4 プロジェクトで SignalR 1.0.1 サーバーを実行しています。別のドメイン (別の localhost ポート) に別の ASP.NET アプリケーションがあり、JavaScript クライアント経由で接続しようとしています。アプリケーションが接続しようとすると、次のようになります。

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>

ハブではなく、SignalR サーバーに PersistentConnection を使用しています。

何か案は?

4

1 に答える 1

17

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

MapConnection への呼び出しは、次のように変更する必要があります。

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

注:の 2 番目の引数MapConnectionは URL です。最初の引数はルート名です。は/不要ですが、どちらの場合も実際には害はありません。

  • 設定jQuery.support.cors = true;は、「cors をまだサポートしていないが、クロスドメイン XHR リクエスト (Windows ガジェットなど) を許可する環境でクロスドメイン リクエストを有効にする場合」にのみ[1]行う必要があります。これは、私が知っている IE やその他のブラウザーのどのバージョンにも当てはまりません。ブラウザーが CORS をサポートしていない場合、trueに設定しない限り、SignalR は既に自動的に JSONP にフォールバックしjQuery.support.corsます。

    これをやみくもに true に設定すると、SignalR は、環境がクロスドメイン XHR 要求をサポートしていると想定し、CORS を本当にサポートしていないブラウザーで実行している間、SignalR がクロスドメイン接続を確立できないことをレンダリングする JSONP に自動的にフォールバックしません

  • $.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 にフォールバックすることを繰り返します。そのため、このオプションを自分で指定しないでください。JSONP はヘッダーを必要としませんが、Access-Control-Allow-OriginSignalR は最も非効率的なトランスポートであるロング ポーリングを使用する必要があります。

  • customHeadersWeb.config でセットアップする必要はありません。youで true にAccess-Control-Allow-Origin設定すると、SignalR は SignalR 応答のヘッダーを自動的に設定します。EnableCrossDomainConnectionConfiguration

の使用に関する詳細なアドバイスについては、https://github.com/SignalR/SignalR/wiki/QuickStart-Persistent-Connectionsを参照してくださいPersistentConnections

于 2013-03-12T17:25:22.330 に答える