Подтвердить что ты не робот

Signalr/Hub не загружается в IIS 7, но корректно работает в Visual Studio

Я работаю над веб-приложением в среде Asp.NET 4.0, которая использует SignalR, установив ее из пакета 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. Если это имеет значение, сервер предоставил приложение Full Trust, и приложение запускается как приложение под другим сайтом в IIS, в котором используется субдомен.

4b9b3361

Ответ 1

Проблема была решена установкой следующих флагов в web.config.

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

По какой-то причине Nuget не установил эти значения для Elmah или SignalR

Ответ 2

Я столкнулся с аналогичной проблемой, я просто изменил /signalr/hubs на /virtualDirectoryName/signalr/hubs, и он сработал.

Ответ 3

Заменить:

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

с:

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

Ответ 4

Ваш Js файл должен быть указан следующим образом:

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

Ответ 5

Вышеприведенный ответ для этого, но я хочу указать, если у вас уже есть URL-редирект для общих правил, которые я сделал, и я был смущен относительно моей проблемы 404, которая не была решена этим, я добавил следующее чтобы перезаписать мое жадное соответствие, вызывающее 404 для URL Rewrite.

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

Это просто здесь, если у кого-то есть аналогичная проблема.

Ответ 6

В нашем случае у нас возникла проблема с атрибутом optimizeCompilations в web.config(http://msdn.microsoft.com/en-us/library/ms366723.aspx). Удаление оптимизационных компиляций из решения web.config.

Ответ 7

Я заметил, что @PCasagrande упомянул в одном из комментариев, что эта проблема была на сайте поддомена.

У меня была аналогичная проблема и добавлено правило перезаписи для удаления папки приложения из URL-адреса. Это решило мою ошибку 404 на "signalr/hubs":

<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>

Ответ 8

Моя ошибка - отсутствующий файл Global.asax в каталоге (dll недостаточно)

Ответ 9

Я также использую субдомен. При использовании 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, но я не думал, что это работает для меня из-за использования веб-форм и моей настройки. Мне пришлось добавить 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 зависит от них, вам нужно будет убедиться, что они работают. Попробуйте добавить настраиваемый маршрут, чтобы проверить, работает ли ваша маршрутизация.