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

时间:2011-11-08 15:53:38

标签: c# iis iis-7 signalr signalr-hub

我正在开发使用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中使用子域的另一个站点下的应用程序运行。

10 个答案:

答案 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可能不会出错,这就是我们忘记上传它的原因。 希望这会有所帮助。