2

Signalr クロスドメインの使用に問題があります。1 つのソリューション内に 3 つの異なるプロジェクト (アプリケーション) があり、signaler を使用してそれらの間でチャット機能を有効にします。他の 3 つのアプリ用に分離されたチャット プロジェクトがあります。

これはそれからのコードです:

ハブ

[HubName("ChatHub")]
public class ChatHub : Hub
 {
    public void Send(PorukaViewModel message)
     {
        ..do some code

        Clients.All.addMessage(
           ... // returns feedback to clients
        );
     }
 }

グローバルASAX

protected void Application_Start()
        {
            RouteTable.Routes.MapHubs(new HubConfiguration() { EnableCrossDomain = true });
        }

これは私のクライアントアプリのコードです

コントローラ

string chatUrl = System.Configuration.ConfigurationManager.AppSettings["ChatUrl"] + "/signalr/hubs";

var connection = new HubConnection(chatUrl, useDefaultUrl: false);
IHubProxy myHub = connection.CreateHubProxy("ChatHub");

connection.Start().ContinueWith(task =>
{
  if (task.IsFaulted)
  {
    //... I log error and stop connection
    connection.Stop();
  }

  message = "some message";
  myHub.Invoke("Send", message).Wait();
    connection.Stop();
});

これはすべてローカルホストで正常に機能しますが、IIS にデプロイすると、次のエラーが発生しますconnection.Start()

System.Net.WebException: リモート サーバーがエラーを返しました: (404) 見つかりません。System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) で Microsoft.AspNet.SignalR.Client.Http.HttpHelper.<>c__DisplayClass2.b__0(IAsyncResult ar) で System.Threading.Tasks.TaskFactory 1.FromAsyncCoreLogic(IAsyncResult iar, Func2 endFunction、アクション1 endAction, Task1 promise、ブール値同期が必要)

stackoverflow ですべての質問と回答を参照しましたが、役立つものが見つかりません。

私は何を間違っていますか?

*ノート

jQuery を使用して、hubs.js を変更し、次のコードを変更しました。

var signalrUrl = $("#chatUrl").val() + '/signalr';
...
signalR.hub = $.hubConnection(signalrUrl, { useDefaultPath: false });

これを通信ビューで使用すると、localhost と IIS の両方で正常に動作します。

多分問題はこの行にありますか?

signalR.hub = $.hubConnection(signalrUrl, { useDefaultPath: false });

元の /signalr/hubs では、次のようになります。

signalR.hub = $.hubConnection("/signalr", { useDefaultPath: false });

どうすればコントローラーからそれを行うことができますか?

4

1 に答える 1

3

このコードは正しくありません:

string chatUrl = System.Configuration.ConfigurationManager.AppSettings["ChatUrl"] + "/signalr/hubs";

/SignalR/Hubs は Javascript プロキシを指します。

/signalr は接続エンドポイントであるため、コードは次のようになります。

string chatUrl = System.Configuration.ConfigurationManager.AppSettings["ChatUrl"];

.NET クライアントはデフォルトの /signalr URL を自動的に追加するため。

ドキュメントの詳細はこちらhttps://github.com/SignalR/SignalR/wiki/SignalR-Client-Hubs#hubconnection-api

于 2013-03-22T19:07:24.183 に答える