27

我正在使用 SignalR 的 Asp .Net 4.0 框架上开发一个 Web 应用程序,并从 Nuget 包安装它。当我在没有本地调试的情况下调试或运行应用程序时,它可以正常工作。但是,当它被部署到生产服务器时,它无法找到signal/hubs动态注入到 httphandlers 中的文件。由于它的动态特性,它必须动态创建,所以我也不能将工作文件复制到项目中。

我尝试了以下加载文件的方法:

<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 中使用子域的另一个站点下运行。

4

10 回答 10

30

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

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

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

于 2011-11-09T14:10:10.427 回答
9

我遇到了类似的问题,我只是将其更改/signalr/hubs/virtualDirectoryName/signalr/hubs并且有效。

于 2012-09-19T13:14:43.960 回答
4

代替:

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

和:

<script src="<%= ResolveUrl("~/signalr/hubs") %>" type="text/javascript"></script>
于 2011-11-08T16:46:38.587 回答
3

你的 Js 文件应该像这样包含:

<script src="~/Scripts/jquery.signalR-2.1.1.js"></script>
<script src="~/signalr/hubs"></script>
于 2016-04-25T10:57:40.893 回答
2

在我们的例子中,我们在 web.config ( http://msdn.microsoft.com/en-us/library/ms366723.aspx ) 中遇到了 optimizeCompilations 属性的问题。从 web.config 中删除 optimizeCompilations 已解决问题。

于 2012-02-22T13:32:12.920 回答
1

以上是这个问题的答案,但我想指出,如果你已经对我所做的通用规则进行 URL 重写,并且我对我的 404 问题感到困惑,但这个问题没有解决,我添加了以下规则来覆盖我的贪婪匹配导致 URL 重写的 404。

<rule name="signalR" stopProcessing="true">
    <match url="^signalr.*" />
    <action type="None" />
</rule>
<!-- greedier rules below -->

这只是在这里,以防有人遇到类似问题。

于 2011-12-27T07:08:13.697 回答
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>
于 2012-03-12T09:05:02.770 回答
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 依赖于它们,因此您需要确保它们正常工作。尝试添加自定义路由以测试您的路由是否正常工作。

于 2012-12-03T00:38:40.893 回答
1

我的错是目录中缺少 Global.asax 文件(dll 不够)

于 2013-08-13T08:38:51.043 回答
0

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

于 2020-05-17T01:25:08.297 回答