Signalr / Hub no se carga en IIS 7 pero funciona correctamente en Visual Studio

Estoy trabajando en una aplicación web en el marco Asp .Net 4.0 que usa SignalR, después de haberlo instalado desde el paquete Nuget. Cuando depuro o ejecuto la aplicación sin depurar localmente, funciona correctamente. Sin embargo, cuando se implementa en el servidor de producción, no puede encontrar el signal/hubs archivo que se está inyectando dinámicamente en el archivo httphandlers. Debido a su naturaleza dinámica, debe crearse sobre la marcha, por lo que tampoco puedo simplemente copiar el archivo de trabajo en el proyecto.

He probado 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 representa en el html parece correcta, pero no hay ningún archivo allí, lo que genera un error 404. Si es importante, el servidor ha otorgado plena confianza a la aplicación y la aplicación se está ejecutando como una aplicación en otro sitio en IIS que usa un subdominio.

preguntado el 08 de noviembre de 11 a las 15:11

También estoy experimentando el mismo problema. Sin embargo, parece que funciona en IIS7 y no en IIS6.

Esto no funciona en IIS7 para nosotros, aunque IIS6 está instalado en el servidor. Sin embargo, IIS6 solo maneja el correo, no el sitio.

10 Respuestas

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

respondido 10 nov., 11:23

Gracias por compartir la solución, me ahorra varias horas. mi escena es serer no puedo enviar mensaje a clent. - Sean

@PCasagrande: - Estoy teniendo un problema similar ... intenté todas las cosas sugeridas anteriormente pero no tuve suerte ... Cualquier ayuda será apreciable. Estoy usando IIS 5.1 y Windows XP. - Pranav

@Pranav, ¿lo instalaste con Nuget? Eso debería hacer la mayor parte del trabajo pesado por ti. ¿Recibe un error 404 cuando navega a la URL / signalr / hubs? - PCasagrande

Sí, lo instalé usando Nuget y obtengo un error 404 mientras navego a / signalr / hubs. - Pranav

¡Sí! después de unas horas, encontré esto y ahora funciona. ¿Podrías explicar por qué necesitábamos esos accesorios? - Alex1984

Estaba enfrentando un problema similar, acabo de cambiar el /signalr/hubs a /virtualDirectoryName/signalr/hubs Y funcionó.

Respondido el 19 de Septiembre de 12 a las 17:09

Reemplacé <script src="/signalr/hubs"></script> con <script src="signalr/hubs"></script> Eliminé la barra inclinada inicial para convertirla en una ruta relativa en lugar de una ruta arraigada. - Wyck

Reemplazar:

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

con:

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

respondido 08 nov., 11:20

Esto no funcionó. Muestra la misma ruta que el código ScriptManager que probé, que no se resuelve. - PCasagrande

@PCasagrande, supongo que su aplicación está alojada en un directorio virtual, por lo que la ruta correcta sería /appname/signalr/hubs. Normalmente el ResolveUrl El método tiene en cuenta el nombre del directorio virtual. - Darin Dimitrov

Se está ejecutando como una aplicación en un sitio, por lo que sí, se requiere el nombre de la aplicación. ResolveUrl aborda eso, pero también lo hace la tilde en el código del lado del servidor. La ruta parece correcta, pero el archivo no está allí. - PCasagrande

Entonces, ¿cuál es la URL resultante en su navegador después de usar ResolveClientUrl? ¿Todavía devuelve un 404 entonces? ¿Estás escribiendo una aplicación MVC? ¿Puede acceder a otras URL sin extensión en su aplicación? - Davidfowl

@dfowler, es una aplicación web de formularios web. La ruta que está generando es / HostingCenterStatus / signalr / hubs que envía la solicitud a subdomain.domain.com/HostingCenterStatus/signalr/hubs y devuelve un error 404. Todas las páginas son default.aspx a las que se navega simplemente usando el nombre de la carpeta. - PCasagrande

Su archivo Js debe incluirse así:

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

Respondido 25 Abr '16, 13:04

Todo lo que hace la tilde es decir que está afectando la raíz del sitio web. Las URL generadas fueron las mismas. Fue un problema con los manejadores que no respondieron a las solicitudes. El problema se resolvió a continuación. - PCasagrande

En nuestro caso, tuvimos un problema con el atributo OptimizeCompilations en web.config (http://msdn.microsoft.com/en-us/library/ms366723.aspx). La eliminación de OptimizeCompilations de web.config solucionó el problema.

Respondido 22 Feb 12, 17:02

Lo anterior es la respuesta para este, pero quiero señalar si ya tiene Reescritura de URL para reglas genéricas que hice y estaba confundido en cuanto a mi problema 404 que no fue resuelto por este, agregué la siguiente regla para sobrescribir mi búsqueda codiciosa que estaba causando el 404 para 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.

Respondido el 28 de diciembre de 11 a las 12:12

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>

respondido 12 mar '12, 13:03

También estoy usando un subdominio. Al usar SignalR 0.5.3, tuve que modificar 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 pensé que funcionara para mí debido al uso de Web Forms 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 poder utilizar las nuevas funciones de enrutamiento que se agregaron en .Net 3.5 SP1 (System.Web.Routing). Dado que SignalR depende de ellos, deberá asegurarse de que estén funcionando. Intente agregar una ruta personalizada para probar que su enrutamiento está funcionando.

Respondido el 03 de diciembre de 12 a las 04:12

Esto ya no es válido para SignalR v2 - David

Mi culpa fue el archivo Global.asax faltante en el directorio (dll no es suficiente)

Respondido 13 ago 13, 12:08

Bonito. Pasé una hora probando todos los demás trucos, pero esto funcionó. BoKDamgaard

Publicación antigua, pero valiosa. Si alguien probó todas las opciones anteriores, asegúrese de poner Biblioteca Microsoft.Owin.Host.SystemWeb.dll en la carpeta Bin del servidor de producción. Esta biblioteca es responsable de crear la carpeta / signalr / hubs. No existe una dependencia directa de esta biblioteca, por lo que es posible que IIS no pase por ningún error sin ella, por eso nos olvidamos de cargarla. Espero que esto ayude.

contestado el 17 de mayo de 20 a las 04:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.