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

Я работаю над веб-приложением на ASP .Net 4.0 framework, который использует 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. Если это имеет значение, сервер предоставил приложению полное доверие, и приложение запускается как приложение на другом сайте в IIS, использующем поддомен.

9 ответов


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

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

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


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


заменить:

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

С:

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

вы JS-файл должен быть включен следующим образом:

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

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

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

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


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


я заметил, что @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>

моей виной был пропавший Глобал.asax файл в каталоге (dll недостаточно)


Я также использую поддомен. При использовании SignalR 0.5.3 мне пришлось изменить сеть.config:

<system.webServer> 
      <modules> 
        <remove name="UrlRoutingModule-4.0" /> 
        <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" /> 
      </modules> 
    </system.webServer>

после обновления до Microsoft.сеть САШ.SignalR 1.0.0-alpha2 NuGet добавил ~ / App_Start / RegisterHubs.cs, но я не думал, что это работает для меня из-за использования веб-форм и моей настройки. Мне пришлось добавить RouteTable.Маршруты.MapHubs (); к моему глобальному.способ эйсакс событий Application_Start.

void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.MapHubs();
    }

в основном убедитесь, что вы можете использовать новые функции маршрутизации, которые были добавлены в .Net 3.5 с пакетом обновления 1 (Система.Сеть.Маршрутизация.) Поскольку SignalR зависит от них, вам нужно будет убедиться, что они работают. Попробуйте добавить пользовательский маршрут, чтобы проверить, работает ли ваш маршрут.