web-dev-qa-db-ja.com

/ signalr / hubsがasp.netmvc4にロードされない:404をスローします

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

  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 Consoleのメッセージは次のようになります:

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

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

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

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

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

15
Pitamber Tiwari

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")に変更することで、問題を解決したようです。

32
Pete

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...
        }
    }
}
5
Mzn

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

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

Install-Package Microsoft.AspNet.SignalR -pre

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

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

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

2
Josh

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

  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に次のコードを追加してください")

1
ShaneKm

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

<add key="owin:AutomaticAppStartup" value="false" />
0
user735232

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

0
abelabbesnabi

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

0
elcid