Durandal/Require.JS - 未找到信号器/集线器参考

Tia*_*eis 4 singlepage requirejs signalr durandal

我正在使用"HotTowel"单页应用模板,但我无法使SignalR正常工作.我收到以下错误:

Failed to load resource: the server responded with a status of 404 (Not Found)
http://localhost:8184/signalr/hubs
Run Code Online (Sandbox Code Playgroud)

我有一种使用标准MVC 4单页面应用程序的样板,有一个非常简单的集线器(用户在线计数器).一切都很好.

切换到"HotTowel"后,它停止工作.我和John Papa一起检查过,他给了我一个建议来检查Durandal方面,因为他提到他知道在一些干扰某些路由的问题上要做一些修复.

main.js:

require.config({
  paths: {
    "text": "durandal/amd/text",
    "signr": "../scripts/jquery.signalR-1.0.1.min"
  }
});
define(['durandal/app', 'durandal/viewLocator', 'durandal/system', 'durandal/plugins/router', 'services/logger', "signr"],
  function (app, viewLocator, system, router, logger, sigr) {

  // Enable debug message to show in the console
  system.debug(true);

  app.start().then(function () {
    toastr.options.positionClass = 'toast-bottom-right';
    toastr.options.backgroundpositionClass = 'toast-bottom-right';

    router.handleInvalidRoute = function (route, params) {
      logger.logError('No Route Found', route, 'main', true);
    };

    // When finding a viewmodel module, replace the viewmodel string 
    // with view to find it partner view.
    router.useConvention();
    viewLocator.useConvention();

    // Adapt to touch devices
    app.adaptToDevice();
    //Show the app by setting the root view model for our application.
    app.setRoot('viewmodels/shell', 'entrance');
  });
});
Run Code Online (Sandbox Code Playgroud)

的Global.asax.cs:

protected void Application_Start()
{
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    // Register the default hubs route: ~/signalr/hubs
    RouteTable.Routes.MapHubs();
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}
Run Code Online (Sandbox Code Playgroud)

HotTowel\index.cshtml:

<body>
  <div id="applicationHost">
    @Html.Partial("_splash")
  </div>

  @Scripts.Render("~/scripts/vendor")
    @if(HttpContext.Current.IsDebuggingEnabled) {
      <script type="text/javascript" src="~/App/durandal/amd/require.js" data-main="@Url.Content("~/App/main")"></script>
    } else {
      <!-- Remember to run the Durandal optimizer.exe to create the main-built.js  -->
      <script type="text/javascript" src="~/App/main-built.js"></script>
    }    
  <script type="text/javascript" src="~/signalr/hubs"></script>    
  @*<script src="~/App/services/hubs.js"></script>*@
</body>
Run Code Online (Sandbox Code Playgroud)

(我知道这可能不是放置它的地方,但我不能让它出现在我的消息来源上,直到我把它放在这里) - 顺便说一下,如果你能告诉我正确的方法来做到这一点,我会很感激

我还能告诉你什么来帮我解决这个问题?我有所有对SignalR等的引用......我有一个使用另一个项目模板的工作示例...

有人可以指导我吗?

应该很容易复制:

  1. 只需使用"HotTowel"模板即可
  2. 添加所有SignalR参考
  3. 用我的代码测试

我想Durandal或Require.Js正在阻碍这一点.有人可以挽救这一天吗?:)

sti*_*rno 10

问题是SignalR需要首先注册其路由.HotTowel模板通过将PreApplicationStartMethod与WebActivator一起使用来尝试"成为第一".

有几种方法可以解决这个问题.我们有WebActivator可用,所以你可以在App_Start中创建一个新类(比如SignalRConfig.cs),如下所示:

[assembly: WebActivator.PreApplicationStartMethod(
typeof(SignalRConfig), "RegisterRoutes", Order = 1)]
public static class SignalRConfig
{
    public static void RegisterRoutes()
    {
        RouteTable.Routes.MapHubs();
    }
}
Run Code Online (Sandbox Code Playgroud)

这将在HotTowel之前注册SignalR的路由.删除对global.asax中MapHubs的调用,因为现在将为您处理.

或者,打开HotTowelRouteConfig.cs并删除/注释掉该属性:

[assembly: WebActivator.PreApplicationStartMethod(
typeof(Empire.Web.App_Start.HotTowelRouteConfig), "RegisterHotTowelPreStart", Order = 2)]
Run Code Online (Sandbox Code Playgroud)

然后进入global.asax,在调用RouteTable.Routes.MapHubs()之后,添加:

HotTowelRouteConfig.RegisterHotTowelPreStart();
Run Code Online (Sandbox Code Playgroud)

在此之后,他们应该玩得很好.

  • 是的,我们使用网络激活器的原因是为了帮助避免弄乱全球性的asax.安装热毛巾后,您可以删除网络激活码并添加自己的路线.另一种方法是添加全局asax代码,但这意味着如果将HotTowel用作NuGet包,它将与现有的global.asax冲突.换句话说,无论哪种方式都不完美.无论如何 - 最好的办法是在app_start/global.asax中添加您的路由,然后删除或移动Web激活码. (3认同)