0

ASP.NET MVC 4 で動作する SignalR を備えた Scott Hanselman のチャット アプリを手に入れました。何時間もの構成、試行錯誤、および異なるバージョンの Windows をホーム ネットワーク上で相互に通信できるようにした後、すべてが機能しています。対処方法がわからないという問題が1つ残っています。

Visual Studio または公開 (IIS) バージョンのどちらでアプリを実行しているかに応じて、この JavaScript の行を変更する必要があります。

VS 内で実行する場合に機能します。

var connection = $.connection('echo');

公開されたバージョンで動作します:

var connection = $.connection('ChatWithSignalR/echo');

VS 内で実行すると、URL は次のようになります。

http://localhost:9145/

そして、公開されたバージョンは次のとおりです。

http://localhost/ChatWithSignalR

そのコード行を変更せずに、ChatWithSignalR を含む JavaScript を使用して VS 内でアプリを実行しようとすると、次のようなエラーが発生します。

Failed to load resource: the server responded with a status of 404 (Not Found)

http://localhost:9145/ChatWithSignalR/echo/negotiate?_=1347809290826

同じ JavaScript コードを使用して両方のシナリオで動作させるにはどうすればよいですか?

var connection = $.connection('??????');

これは私の Global.asax.cs にあることに注意してください。

RouteTable.Routes.MapConnection<MyConnection>("echo", "echo/{*operation}");
4

1 に答える 1

1

SignalR ライブラリはアプリのデプロイ先とそのルート アドレスを認識していないため、これは注意が必要です。私が Web アプリケーションで常に行っていることは、グローバル Javascript 変数を呼び出しsite_rootて、サイトのルートの絶対 URL と同じ値に設定することです。さて、これを行うには、それを評価して出力するためのサーバータグが必要です"<%= RootUrl %>"。たとえば、サーバー言語の構文のようなものです。次に、Javascript で URL を参照するときは、常に site_root + "/echo" を使用する必要があります (サーバー変数/メソッドによって出力される内容に応じて、先頭の "/" の有無にかかわらず)。したがって、次のようになります。

<script type="text/javascript">
    var site_root = "<%= RootUrl %>";

    // Later, wherever in your code:
    function doSomething() {
        var echo_url = site_root + "/echo";
        // Now you have an absolute URL for the echo page
    }
</script>

ここで、これを常に含まれるマスター レイアウト ページに配置します - マスター ページのように、または使用するサーバー言語によって異なります。また、 のような変数の代わりに、RootUrl何らかのメソッドを使用して URL を解決し、空の文字列または「/」を渡すだけで、アプリケーションのルート URL を取得できます。

于 2012-09-16T17:48:01.970 に答える