我正在开发使用SignalR的Asp .Net 4.0框架上的Web应用程序,已经从Nuget包中安装了它。当我调试或运行应用程序而不在本地调试时,它可以正常工作。但是,当它部署到生产服务器时,它无法找到动态注入httphandlers的signal/hubs
文件。由于它的动态特性,它必须在运行中创建,因此我不能将工作文件复制到项目中。
我尝试了以下加载文件的方法:
<script src="/signalr/hubs" type="text/javascript"></script>
<script src="signalr/hubs" type="text/javascript"></script>
在后面的代码中:
ScriptManager.GetCurrent(Page).Scripts.Add(new ScriptReference("~/signalr/hubs"));
所有这些都在本地工作,但不在服务器上。在html中呈现的路径看起来是正确的,但那里没有文件,传递404错误。如果重要,服务器已授予应用程序完全信任,并且该应用程序将作为IIS中使用子域的另一个站点下的应用程序运行。
答案 0 :(得分:30)
通过在web.config中设置以下标志来解决问题。
<configuration>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
</modules>
</system.webServer>
</configuration>
由于某种原因,Nuget没有为Elmah或SignalR设置这些值
答案 1 :(得分:9)
我遇到了类似的问题,我刚刚将/signalr/hubs
更改为/virtualDirectoryName/signalr/hubs
并且有效。
答案 2 :(得分:4)
替换:
<script src="/signalr/hubs" type="text/javascript"></script>
使用:
<script src="<%= ResolveUrl("~/signalr/hubs") %>" type="text/javascript"></script>
答案 3 :(得分:3)
You Js文件应该包括这样:
<script src="~/Scripts/jquery.signalR-2.1.1.js"></script>
<script src="~/signalr/hubs"></script>
答案 4 :(得分:1)
上面是这个问题的答案,但我想指出,如果你已经对我做过的通用规则进行了网址重写,并且我对我的404问题感到困惑,这个问题没有被这个解决,我添加了以下内容规则覆盖导致404重写URL的贪婪匹配。
<rule name="signalR" stopProcessing="true">
<match url="^signalr.*" />
<action type="None" />
</rule>
<!-- greedier rules below -->
这就是有人遇到类似问题的时候。
答案 5 :(得分:1)
在我们的案例中,我们在web.config(http://msdn.microsoft.com/en-us/library/ms366723.aspx)中遇到了optimizeCompilations属性的问题。从web.config中删除optimizeCompilations解决了问题。
答案 6 :(得分:1)
我注意到@PCasagrande在其中一条评论中提到此问题出现在子域网站上。
我遇到了类似的问题,并添加了重写规则以从网址中删除应用程序文件夹。 这解决了我在'signalr / hubs'上的404错误:
<rule name="Remove SubDomain folder from url" stopProcessing="false">
<match url="^(.*)SubDomain/(.*)$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
<action type="Rewrite" url="{R:1}{R:2}" />
</rule>
我在子域的重写规则之前添加了“删除子域”规则:
<rule name="Redirect subdomain.domain.com to SubDomain folder" enabled="true">
<match url="^(.*)$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern="^subdomain\.domain\.com$" />
</conditions>
<action type="Rewrite" url="/SubDomain/{R:0}" />
</rule>
答案 7 :(得分:1)
我也在使用子域名。使用SignalR 0.5.3时,我不得不修改web.config:
<system.webServer>
<modules>
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
</modules>
</system.webServer>
升级到Microsoft.AspNet.SignalR 1.0.0-alpha2之后NuGet添加了〜/ App_Start / RegisterHubs.cs,但由于使用Web窗体和我的设置,我认为这对我没有用。我不得不添加RouteTable.Routes.MapHubs();到我的Global.asax Application_Start方法。
void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.MapHubs();
}
基本上确保您可以使用.Net 3.5 SP1(System.Web.Routing)中添加的新路由功能。由于SignalR依赖于它们,因此您需要确保它们正常工作。尝试添加自定义路由以测试您的路由是否正常工作。
答案 8 :(得分:1)
我的错是目录中缺少的Global.asax文件(dll还不够)
答案 9 :(得分:0)
旧帖子,但仍然有价值。 如果有人尝试了上述所有选项,请确保将 Microsoft.Owin.Host.SystemWeb.dll库放入生产服务器的Bin文件夹。该库负责创建/ signalr / hubs文件夹。 没有对该库的直接依赖,因此,如果没有它,IIS可能不会出错,这就是我们忘记上传它的原因。 希望这会有所帮助。