c# - start - Signalr/Hub no se carga en IIS 7 pero funciona correctamente en Visual Studio
signalr server c# (9)
Estoy trabajando en una aplicación web en el framework Asp .Net 4.0 que usa SignalR, habiéndolo instalado desde el paquete Nuget. Cuando depuro o ejecuto la aplicación sin depuración local, funciona correctamente. Sin embargo, cuando se implementa en el servidor de producción, no puede encontrar el archivo de signal/hubs
que se inyecta dinámicamente en los httphandlers. Debido a su naturaleza dinámica, tiene que crearse sobre la marcha, por lo que tampoco puedo copiar el archivo de trabajo en el proyecto.
He intentado los siguientes métodos para cargar el archivo:
<script src="/signalr/hubs" type="text/javascript"></script>
<script src="signalr/hubs" type="text/javascript"></script>
Y en el código detrás:
ScriptManager.GetCurrent(Page).Scripts.Add(new ScriptReference("~/signalr/hubs"));
Todos estos funcionan localmente pero no en el servidor. La ruta que se procesa en el html parece correcta, pero no hay ningún archivo allí, lo que genera un error 404. Si es importante, el servidor le ha otorgado a la aplicación plena confianza y la aplicación se está ejecutando como una aplicación en otro sitio en IIS que utiliza un subdominio.
El problema se resolvió estableciendo los siguientes indicadores en web.config.
<configuration>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
</modules>
</system.webServer>
</configuration>
Por alguna razón, Nuget no estableció estos valores para Elmah o SignalR
En nuestro caso, tuvimos problemas con el atributo optimizeCompilations en web.config ( http://msdn.microsoft.com/en-us/library/ms366723.aspx ). Se eliminó optimizeCompilations del problema resuelto de web.config.
Estaba enfrentando un problema similar, simplemente cambié el /signalr/hubs
a /virtualDirectoryName/signalr/hubs
y funcionó.
Lo anterior es la respuesta para esto, pero quiero señalar si ya tiene Reescritura de URL para reglas genéricas que yo hice y estaba confundido en cuanto a mi problema 404 que no fue resuelto por este, agregué la siguiente regla para sobrescribir mi coincidencia codiciosa que estaba causando el 404 para la reescritura de URL.
<rule name="signalR" stopProcessing="true">
<match url="^signalr.*" />
<action type="None" />
</rule>
<!-- greedier rules below -->
Esto es solo aquí en caso de que alguien tenga un problema similar.
Mi error fue la falta del archivo Global.asax en el directorio (dll no es suficiente)
Noté que @PCasagrande mencionó en uno de los comentarios que este problema estaba en un sitio de subdominio.
Tuve un problema similar y agregué una regla de reescritura para eliminar la carpeta de la aplicación de la url. Esto resolvió mi error 404 en ''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>
Agregué la regla ''eliminar subdominio'' antes de la regla de reescritura para el subdominio:
<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>
Reemplazar:
<script src="/signalr/hubs" type="text/javascript"></script>
con:
<script src="<%= ResolveUrl("~/signalr/hubs") %>" type="text/javascript"></script>
Su archivo Js debe incluirse así:
<script src="~/Scripts/jquery.signalR-2.1.1.js"></script>
<script src="~/signalr/hubs"></script>
También estoy usando un subdominio. Al usar SignalR 0.5.3, tuve que modificar el web.config:
<system.webServer>
<modules>
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
</modules>
</system.webServer>
Después de actualizar a Microsoft.AspNet.SignalR 1.0.0-alpha2 NuGet agregó un ~ / App_Start / RegisterHubs.cs, pero no creía que eso funcionara para mí debido al uso de formularios web y mi configuración. Tuve que agregar RouteTable.Routes.MapHubs (); a mi método Global.asax Application_Start.
void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.MapHubs();
}
Básicamente, asegúrese de que puede usar las nuevas características de enrutamiento que se agregaron en .Net 3.5 SP1 (System.Web.Routing). Como SignalR depende de ellos, deberá asegurarse de que estén funcionando. Intente agregar una ruta personalizada para probar que su enrutamiento está funcionando.