我刚刚得到了Scott Hanselman的chat app,SignalR与ASP.NET MVC 4合作。经过数小时的配置,试验和错误,以及让不同版本的Windows在我的家庭网络上互相交流,这一切都是工作,除了我留下了一个我不确定如何处理的问题。
这行javascript必须更改,具体取决于我是通过Visual Studio还是已发布的(IIS)版本运行应用程序:
在VS中运行时工作:
var connection = $.connection('echo');
适用于已发布的版本:
var connection = $.connection('ChatWithSignalR/echo');
当我在VS中运行时,网址为:
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}");
答案 0 :(得分:1)
这是您需要注意的事项,因为SignalR库不知道应用程序的部署位置以及它的根地址是什么。我在Web应用程序中总是做的事情是有一个名为site_root
的全局Javascript变量,并将其设置为等于站点根目录的绝对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,而只是传递一个空字符串或“/”来获取应用程序的根URL,而不是像RootUrl
这样的变量。