2

私は次のことを達成しようとしています: 1. SignalR の永続的な接続をホストするサーバー (今のところ WinForms) 2. ASP.NET MVC クライアント

サーバーはポート 8000 で実行され、クライアントは (Visual Studio 経由で) ポート 22914 で実行されます。しかし、これをテストすると、次のエラーが発生します。

XMLHttpRequest cannot load http://localhost:8000/echo/negotiate?_=1352825948654. Origin http://localhost:22914 is not allowed by Access-Control-Allow-Origin.

これまでのところ、クロス ドメイン通信が許可されていることを指定する必要があります。これはサーバー上で行う必要があると思います。しかし、どこで、どのように?解決策が見つかりません。残念ながら、WinForms アプリでの SignalR 接続の自己ホストに関する Web 上のリソースはあまりありません。

4

3 に答える 3

1

CORS には、単純なリクエストとプリフライト リクエストの 2 つの方法があります。

単純なリクエストは、GET/POST動詞を使用して通常のリクエストを行いAccess-Control-Allow-Origin、通常のレスポンスでヘッダーを見つけることを期待します。飛行前のシナリオでは、リクエストが送信され、その動詞を具体的に処理し、一連のヘッダーOPTIONで応答する必要があります。Access-Control-XXX

これをサポートするために仕様に完全に入ることなく、ホストの応答の途中で取得し、Access-Control-Allow-Origin単純な要求のヘッダーを挿入する必要があります。OPTIONプリフライト アプローチを使用する可能性のあるクライアントが予想される場合は、動詞に特定の処理を追加する必要もあります。あなたがカスタム ホスティングをどのように行っているか正確にはわからないので、その方法について具体的なアドバイスをすることはできませんが、うまくいけば、これがあなたのやり方に役立つことを願っています.

于 2012-11-13T17:55:57.980 に答える
1

私は最近、この問題に遭遇しました。答えは、クライアント アプリケーションでサーバーの URL とポートを指定することです。つまり、次のシナリオの場合です。

サーバ:http://localhost:8000/

クライアント:http://localhost:22914/

クライアント アプリケーション:

$.connection.hub.url = 'http://localhost:8000/signalr'

$.connection.hub.start();

Github の SignalR Client Hubs Wikiの下部に記載されています。

于 2013-01-24T10:37:05.907 に答える
0

SignalR コードを見ると、自己ホスト型サーバーが応答時に Access-Control-Allow-Origin を自動的に追加しているように見えます。これは、単に要求ヘッダーの "Origin" 値を反映するだけです。

からMicrosoft.AspNet.SignalR.Hosting.Self.Server.ProcessRequestAsync():

string origin = context.Request.Headers["Origin"];
if (!String.IsNullOrEmpty(origin))
{
    context.Response.AddHeader("Access-Control-Allow-Origin", origin);
    context.Response.AddHeader("Access-Control-Allow-Credentials", "true");
}

どうやら、セルフホスティングの場合、すべてがクロスドメインになるという前提があるため、先に進んですべてを許可しましょう. それが最善の仮定であるかどうかはわかりませんが、配線の際に間違いが 1 つ少なくなることは確かです。

また、必ずしも問題に対処しているわけではありませんが、ヘッダーに Access-Control-Allow-Origin が設定されていないことと問題がおそらく関係ないことを意味します。

于 2012-11-16T18:52:20.177 に答える