0

我刚刚得到了 Scott Hanselman 的带有 SignalR 的聊天应用程序与 ASP.NET MVC 4 一起工作。经过数小时的配置、反复试验,并让不同版本的 Windows 在我的家庭网络上相互通信,除了我在留下一个我不知道如何处理的问题。

这行 javascript 必须更改,具体取决于我是通过 Visual Studio 还是已发布 (IIS) 版本运行应用程序:

在 VS 中运行时工作:

var connection = $.connection('echo');

适用于已发布版本:

var connection = $.connection('ChatWithSignalR/echo');

当我在 VS 中运行时,URL 是:

http://localhost:9145/

发布的版本是:

http://localhost/ChatWithSignalR

如果我不更改那行代码,并尝试在 VS 中运行应用程序,使用其中包含 ChatWithSignalR 的 javascript,我会收到如下错误:

Failed to load resource: the server responded with a status of 404 (Not Found)

http://localhost:9145/ChatWithSignalR/echo/negotiate?_=1347809290826

我该怎么做才能使用相同的 javascript 代码并让它在两种情况下都能正常工作?

var connection = $.connection('??????');

请注意,这是在我的 Global.asax.cs 中:

RouteTable.Routes.MapConnection<MyConnection>("echo", "echo/{*operation}");
4

1 回答 1

1

这是您需要注意的事情,因为 SignalR 库不知道应用程序部署到哪里以及它的根地址是什么。我在 Web 应用程序中经常做的事情是调用一个全局 Javascript 变量site_root,并将其设置为站点根目录的绝对 URL。现在,要做到这一点,您需要服务器标签来评估和打印它,就像"<%= RootUrl %>"您的服务器语言的语法一样。然后,在 Javascript 中引用 URL 时,您应该始终使用 site_root + "/echo"(有或没有开头的“/”,具体取决于服务器变量/方法打印的内容)。所以你会有类似的东西:

<script type="text/javascript">
    var site_root = "<%= RootUrl %>";

    // Later, wherever in your code:
    function doSomething() {
        var echo_url = site_root + "/echo";
        // Now you have an absolute URL for the echo page
    }
</script>

现在,我将它放在始终包含的母版布局页面中 - 就像母版页一样,或者取决于您使用的服务器语言。此外,您可以使用某种方法来解析 URL,而不是像 之类的变量RootUrl,然后将其传递给空字符串或“/”以获取应用程序的根 URL。

于 2012-09-16T17:48:01.970 回答