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, Func
2 endFunction、アクション1 endAction, Task
1 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 });
どうすればコントローラーからそれを行うことができますか?