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