Signalr/Hub在IIS 7中无法加载,但在Visual Studio中正常工作

27
我正在开发一个基于Asp .Net 4.0框架的Web应用程序,使用了从Nuget包中安装的SignalR。当我在本地调试或运行应用程序时,它可以正确工作。但是,当部署到生产服务器上时,它无法找到被动态注入到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中使用子域的另一个站点下的应用程序运行。


我也遇到了同样的问题。似乎在IIS7上可以工作,但在IIS6上却不行。 - user989953
这在我们的IIS7上无法工作,尽管服务器安装了IIS6。但是IIS6仅处理邮件,而不是网站。 - PCasagrande
10个回答

31

通过在web.config中设置以下标志,问题得到了解决。

<configuration>
    <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
        <modules runAllManagedModulesForAllRequests="true">
        </modules>
    </system.webServer>
</configuration>

由于某种原因,Nuget没有为Elmah或SignalR设置这些值


@PCasagrande:我遇到了类似的问题..我尝试了上面提到的所有方法,但都没有成功..任何帮助将不胜感激。我正在使用IIS 5.1和Windows XP。 - Pranav
@Pranav 你是用 Nuget 安装的吗?这应该为你完成大部分繁重的工作。当你导航到 /signalr/hubs url 时,你是否收到了 404 错误? - PCasagrande
是的,我使用 Nuget 安装了,但在导航到 /signalr/hubs 时出现了 404 错误。 - Pranav
太好了!几个小时后,我找到了这个问题的解决方法,现在它可以正常工作了。你能解释一下为什么我们需要那些属性吗? - alexmage
我认为 runAllManagedModulesForAllRequests 真正解决了问题。基本上,它打开了可以拦截请求并以某种方式处理它们的模块。例如,它们是使 .aspx 页面执行操作的因素。在这里,它拦截了一个文件不存在的请求,并运行最终创建输出的代码。有关说明,请参阅 https://dev59.com/hWgu5IYBdhLWcg3w0qRK。 - PCasagrande
显示剩余2条评论

9

我曾遇到类似的问题,只需将/signalr/hubs 改为 /virtualDirectoryName/signalr/hubs 即可解决。


我将<script src="/signalr/hubs"></script>替换为<script src="signalr/hubs"></script>,去掉了前导斜杠,使其成为相对路径而不是根路径。 - Wyck

4

替换:

<script src="/signalr/hubs" type="text/javascript"></script>

使用:

<script src="<%= ResolveUrl("~/signalr/hubs") %>" type="text/javascript"></script>

这个不起作用。它输出与我尝试的ScriptManager代码相同的路径,但无法解决。 - PCasagrande
@PCasagrande,我假设你的应用程序托管在虚拟目录中,因此正确的路径应该是/appname/signalr/hubs。通常,ResolveUrl方法会考虑虚拟目录名称。 - Darin Dimitrov
它作为站点下的应用程序运行,因此需要appname。ResolveUrl可以解决这个问题,但服务器端代码中的波浪线也可以。路径看起来正确,但文件不存在。 - PCasagrande
@dfowler,这是一个Web Forms Web应用程序。它生成的路径是/HostingCenterStatus/signalr/hubs,该路径将请求发送到http://subdomain.domain.com/HostingCenterStatus/signalr/hubs,并返回404错误。所有页面都是default.aspx,只需使用文件夹名称导航即可。 - PCasagrande
@PCasagrande,您在IIS中运行应用程序时是使用集成模式还是经典模式? - Darin Dimitrov
显示剩余3条评论

3
您的JS文件应该像这样包含:

<script src="~/Scripts/jquery.signalR-2.1.1.js"></script>
<script src="~/signalr/hubs"></script>

波浪符号(~)只是表示它影响到了网站的根目录。生成的URL是相同的。这是处理程序未对请求触发的问题。以下是解决方案。 - PCasagrande

2

1

我注意到@PCasagrande在评论中提到这个问题是在子域名站点上。

我遇到了类似的问题,并添加了一个重写规则来从URL中删除应用程序文件夹。这解决了我在'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>

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 Forms和我的设置,我认为它对我没有用。我不得不在Global.asax的Application_Start方法中添加RouteTable.Routes.MapHubs();。
void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.MapHubs();
    }

基本上,确保您可以使用在 .Net 3.5 SP1 (System.Web.Routing) 中添加的新路由功能。由于 SignalR 依赖于它们,因此您需要确保它们正常工作。尝试添加自定义路由以测试您的路由是否正常工作。


这对于SignalR v2已不再有效。 - David

1
以上是对此问题的答案,但我想指出,如果您已经为通用规则进行了URL重写(就像我一样),并且您对未解决404问题感到困惑,那么您可以添加以下规则来覆盖贪婪匹配,从而解决URL重写引起的404问题。
<rule name="signalR" stopProcessing="true">
    <match url="^signalr.*" />
    <action type="None" />
</rule>
<!-- greedier rules below -->

这只是为了防止有人遇到类似的问题而放在这里。


1

我的错误是目录中缺少了Global.asax文件(仅有dll不足够)。


不错。我花了一个小时尝试了所有其他的技巧,但这个有效。 - BoKDamgaard

0

旧文章,但仍有价值。 如果有人尝试了上述所有选项,请确保将Microsoft.Owin.Host.SystemWeb.dll库放入生产服务器的Bin文件夹中。该库负责创建/signalr/hubs文件夹。 没有直接依赖于此库,所以可能IIS在没有它的情况下不会出现任何错误,这就是为什么我们忘记上传它的原因。 希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接