15

これが私がしたことです。

  1. nugetを使用して、MVC4プロジェクトのSignalRを取得しました。
  2. コントローラ(SignalRTestController.cs)にMyHubクラスを作成しました
  3. インデックスアクションで、ハブの外部からメッセージをブロードキャストしようとし、ビューを返しました。
  4. ビューで、すべてのスクリプトと/ signalr/hubsを参照しました。

問題は/signalr/hubsが見つからないことです(404をスローします)。

私のプロジェクトには領域があり、次のように構成されています。

  1. MVCProject
    • エリア
      • サブフォルダ
        • コントローラ
          • SignalRTestController.cs
        • モデル
        • 意見
          • Index.cshtml
    • コントローラ
    • モデル
    • 意見
    • スクリプト

signalRのすべてのスクリプトはScriptsフォルダー内にあり、SignalRTestController.csは次のようになります。

namespace SignalRTest.Controllers
{
public class SignalRTestController : Controller
{
    public ActionResult Index()
    {
        // Do some work here

        // Broadcasting over a Hub from outside of a Hub
        var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
        context.Clients.say("Hello SignalR!");

       return View();
    }
}

[HubName("MyHub")]
public class MyHub : Hub
{
    public void Say(string message)
    {
        Clients.sendMessage(message);
    }
}
}

私のIndex.cshtmlには、以下のようにすべてのjavascriptと/ signalr/hubsへの参照があります。//その他のJavascript

スクリプトtype="text / javascript" src = "/ signalr /hubs" />

コントローラは問題ないと思いますが、/ signalr/hubsを取得していません。404がスローされ、Chromeコンソールのメッセージは次のようになります。

スクリプトとして解釈されるが、MIMEタイプtext / htmlで転送されるリソース:「http://www.myproject.com/signalr/hubs」。Uncaught SyntaxError:予期しないトークン<hubs:2 Uncaught SignalR:ハブのロード中にエラーが発生しました。ハブの参照が正しいことを確認します(例:script src ='/ signalr /hubs'>)。

スクリプトがhtmlとして返される理由は、サーバーが404notfoundを返しているためです。

何が悪いのかわかりません。これはルーティングの問題かもしれないと思います。/ signalr / Hubsのプロジェクトにルーティング情報を追加する必要があるのか​​、それともここで何かが足りないのかはわかりません。

参考:新しい空のMVCプロジェクトを作成し、signalRを追加して作業を開始すると、完全に正常に機能します。ルーティングを追加する必要はありません。

また、いくつかの場所でデフォルトルーティングと属性ルーティングの両方を使用しています。ただし、コントローラーSignalRTestControllerは属性ルーティングを使用しません。

4

7 に答える 7

32

RouteTable.Routes.MapHubs()(おそらくGlobal.asax内)への呼び出しがありますか?もしそうなら、それを取り除き、それがあなたの問題を解決するかどうか見てみてください。–ピート11月16日17:22

もう少し遊んでいます。現在のバージョンでは(署名されたアセンブリが必要だったため、最新のソースを入手しました)、RouteTable.Routes.MapHubs()を呼び出す必要があるようです。ただし、それが機能するためには、最初に(または少なくともRouteConfig.RegisterRoutes()呼び出しの前に)呼び出す必要がありました。その後呼び出された場合、MVCはそのコントローラーを探しに行き、それは機能しません。nuGet経由で取得した以前のバージョンでは、RouteTable.Routes.MapHubs()を削除すると問題が解決しましたが、現在は必須のようです。お役に立てば幸いです。-ピート11月27日20:53


どうやら、RouteTable.Routes.MapHubs()をRouteTable.Routes.MapHubs( "〜/ signalr")に変更することで、問題を解決したようです。

于 2012-12-07T16:21:23.350 に答える
5

MapHubsは廃止されました。次のように、OwinスタートアップクラスでMapSignalR拡張メソッドを使用します。

[assembly: OwinStartupAttribute(typeof(signalr_test.Startup))]
namespace signalr_test
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
            app.MapSignalR(); //can take path also see overloads...
        }
    }
}
于 2015-11-14T20:45:39.097 に答える
2

私は同じ問題を経験していました。修正は次のとおりです。

Nugetは、必要なすべての参照を追加しませんでした。このコマンドを再実行しました:

Install-Package Microsoft.AspNet.SignalR -pre

そしてそれはさらにいくつかの参照を追加しました:

  • Microsoft.AspNet.SignalR.Hosting.Aspnet
  • Microsoft.AspNet.SignalR.Hosting.Common

それが行われると、それはチャンピオンのように機能しました!

于 2012-12-01T23:28:35.210 に答える
1

参照に問題があります。以下をせよ:

  1. AppStart/Bundle.Config.csに次を追加します。

    bundles.Add(new ScriptBundle("~/bundles/signalR").Include(
        "~/Scripts/jquery.signalR-{version}.js"));
    
  2. layout.cshtmlに次を追加します。

    @ Scripts.Render( "〜/ bundles / signalR")

  3. signalRを使用しているページで、次のようにsignalRハブを参照していることを確認してください。

/ signalr /hubs

このページで行われているように: http ://blog.devscrum.net/2011/12/getting-started-with-signalr-in-asp-net-mvc/(「index.cshtmlに次のコード」)

于 2012-11-13T09:16:45.883 に答える
0

に変更[HubName("MyHub")]してみ[HubName("myHub")]て、JavaScriptでプロキシを作成する場所で必ず更新してください。それは過去に私のために働いた。

于 2012-10-02T20:30:29.790 に答える
0

私の場合、誤って同じ名前の2つのハブクラスを異なる場所に作成しました(ハブから派生した2つのクラス)。1つ削除すると、すべて機能しました。

于 2015-03-23T02:45:36.880 に答える
0

私の場合、web.config appSettingsに、削除する必要のあるキーがありました。

<add key="owin:AutomaticAppStartup" value="false" />
于 2017-02-02T18:57:33.007 に答える