6

編集: これは明らかに Chrome のみの問題であり、FF と IE では正常に動作します。

Chrome バージョン: 27.0.1453.116

localhost:13371 に単純な JS/HTML サイトがあり、localhost:13371 の SignalR ハブにアクセスしようとしています。

リクエストが行われるたびに、次のエラーが発生します。

XMLHttpRequest を読み込めませんhttp://localhost:13370/signalr/hubs/negotiate?_=1372338722032http://localhost:13371Access-Control-Allow-Origin でオリジンが許可されていません。

私がすでに試したこと:

  • SignalR on でクロスドメインを有効にしApplication_Startます。

    RouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true });
    
  • SignalR サーバーの Web.Config でクロスドメインを有効にします。

    <system.webServer>
       <httpProtocol>
         <customHeaders>
           <clear />
           <add name="Access-Control-Allow-Origin" value="*" />
           <add name="Access-Control-Allow-Methods" value="*" />
           <add name="Access-Control-Allow-Headers" value="*" />
         </customHeaders>
       </httpProtocol>
    </system.webServer>
    
  • JavaScript で signalr のハブに接続 URL を設定する:

    $.connection.hub.url = 'http://localhost:13370/signalr/hubs';
    
  • jQuery で CORS を有効にします。

    $.support.cors = true;
    
  • で応答ヘッダーを手動で設定するApplication_BeginRequest:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
    
        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            //These headers are handling the "pre-flight" OPTIONS call sent by the browser
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "*");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
            HttpContext.Current.Response.End();
        }
    }
    

上記のいずれも、または上記の組み合わせも機能しませんでした。

追加情報:

  • 両方のサイトが Windows 7 の IIS で実行されています
  • SignalR サイトは、.NET 4.0 の MVC 4 サイトの一部として、ポート 13370 で実行されています。
  • JS/HTML サイトは、ポート 13371 の単純な Web サーバーであり、マネージ コードはまったくありません。
  • SignalR サイトは、問題のリソースに対するブラウザーからの直接の要求に確実に応答します。
  • SignalR のバージョンは 1.1.2 です
4

5 に答える 5

5

編集:これに対して2つの解決策を見つけました...

方法 1. おそらく必要のないがらくたを取り除く:

このStack Overflow questionで見つけたように、基本的に、上記の「試したこと」のリストに追加したほとんどすべてが不要でした。修正手順:

  1. 上記で試したリストにあるものをすべて削除します。つまり、Web.Config または Global.asax などの他の場所でカスタム ヘッダーがまったく指定されていないこと、カスタム jquery 設定などがないことを意味します。

  2. .. を除いRouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true });Application_Start

  3. また、まだ設定する必要があります$.connection.hub.url = 'http://localhost:13370/signalr/hubs';

... それでおしまい。 これはおそらく最良の解決策であり、私が最終的に使用したものです。

方法 2. Chrome でまだ問題がある場合は、jsonp を使用します。

Chrome でこのような問題が引き続き発生する場合は、jsonp を使用してネゴシエート スクリプトを適切にダウンロードすることができます。JavaScript ハブ スタートに以下を追加すると、問題が解決しました。

//detect chrome
var isChrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;

//set the connection url.
$.connection.hub.url = 'http://localhost:13370/signalr/hubs';

//use jsonp if chrome
$.connection.hub.start({
    jsonp: isChrome
});

ブラウザの機能をテストし、それに応じてjsonpを設定する、これを行うためのより良い方法がおそらくあります...ユーザーエージェントを見ると、地獄のように汚いと感じます...しかし、これは暫定的に私の問題を解決しました。これが他の誰かに役立つことを願っています。

于 2013-06-27T15:13:58.880 に答える
1

これは私にとってはうまくいきました。このメソッドを Global.asax.cs に配置します

protected void Application_BeginRequest(object sender, EventArgs e)
{
    Context.Response.AppendHeader("Access-Control-Allow-Credentials", "true");
    var referrer = Request.UrlReferrer;
    if (Context.Request.Path.Contains("signalr/") && referrer != null)
    {
        Context.Response.AppendHeader("Access-Control-Allow-Origin", referrer.Scheme + "://" + referrer.Authority);
    }
}
于 2014-02-03T16:47:21.947 に答える
0

それはドキュメントにありますが、決してこれをしないでください:

$.support.cors = true;

于 2013-07-17T17:22:02.067 に答える