Je travaille sur une application Web sur le framework Asp .Net 4.0 qui utilise SignalR, après l'avoir installée à partir du package Nuget. Lorsque je débogue ou exécute l'application sans déboguer localement, cela fonctionne correctement. Cependant, lorsqu'il est déployé sur le serveur de production, il ne parvient pas à trouver le signal/hubs
fichier qui est dynamiquement injecté dans les httphandlers. En raison de sa nature dynamique, il doit être créé à la volée, donc je ne peux pas simplement copier le fichier de travail dans le projet non plus.
J'ai essayé les méthodes suivantes de chargement du fichier:
<script src="/signalr/hubs" type="text/javascript"></script>
<script src="signalr/hubs" type="text/javascript"></script>
Et dans le code derrière:
ScriptManager.GetCurrent(Page).Scripts.Add(new ScriptReference("~/signalr/hubs"));
Tous ces éléments fonctionnent localement mais pas sur le serveur. Le chemin qui est rendu dans le html semble correct, mais il n'y a pas de fichier, générant une erreur 404. Si cela est important, le serveur a accordé à l'application une confiance totale et l'application est exécutée en tant qu'application sous un autre site dans IIS qui utilise un sous-domaine.
Le problème a été résolu en définissant les indicateurs suivants dans le web.config.
<configuration>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
</modules>
</system.webServer>
</configuration>
Pour une raison quelconque, Nuget n'a pas défini ces valeurs pour Elmah ou SignalR
J'étais confronté à un problème similaire, je viens de changer le /signalr/hubs
à /virtualDirectoryName/signalr/hubs
et cela a fonctionné.
Remplacer:
<script src="/signalr/hubs" type="text/javascript"></script>
avec:
<script src="<%= ResolveUrl("~/signalr/hubs") %>" type="text/javascript"></script>
Votre fichier Js doit être inclus comme ceci:
<script src="~/Scripts/jquery.signalR-2.1.1.js"></script>
<script src="~/signalr/hubs"></script>
Dans notre cas, nous avons eu un problème avec l'attribut OptimizeCompilations dans web.config ( http://msdn.Microsoft.com/en-us/library/ms366723.aspx ). Suppression d'optimiser les compilations du problème résolu de web.config.
J'utilise également un sous-domaine. Lors de l'utilisation de SignalR 0.5.3, j'ai dû modifier le web.config:
<system.webServer>
<modules>
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
</modules>
</system.webServer>
Après la mise à niveau vers Microsoft.AspNet.SignalR 1.0.0-alpha2 NuGet a ajouté un ~/App_Start/RegisterHubs.cs, mais je ne pensais pas que cela fonctionnait pour moi en raison de l'utilisation de formulaires Web et de ma configuration. J'ai dû ajouter RouteTable.Routes.MapHubs (); à ma méthode Global.asax Application_Start.
void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.MapHubs();
}
Assurez-vous que vous pouvez utiliser les nouvelles fonctionnalités de routage ajoutées dans .Net 3.5 SP1 (System.Web.Routing). Étant donné que SignalR dépend d'eux, vous devrez vous assurer qu'ils fonctionnent. Essayez d'ajouter un itinéraire personnalisé pour tester le bon fonctionnement de votre routage.
J'ai remarqué @PCasagrande mentionné dans l'un des commentaires que ce problème était sur un site de sous-domaine.
J'ai eu un problème similaire et j'ai ajouté une règle de réécriture pour supprimer le dossier d'application de l'URL. Cela a résolu mon erreur 404 sur '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>
J'ai ajouté la règle "supprimer le sous-domaine" avant la règle de réécriture pour le sous-domaine:
<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>
Ma faute était le fichier Global.asax manquant dans le répertoire (la DLL n'est pas suffisante)
Ce qui précède est la réponse pour celui-ci, mais je tiens à souligner si vous avez déjà la réécriture d'URL pour les règles génériques que j'ai fait et que j'étais confus quant à mon problème 404 qui n'a pas été résolu par celui-ci, j'ai ajouté la règle suivante pour écraser ma correspondance gourmande qui provoquait le 404 pour la réécriture d'URL.
<rule name="signalR" stopProcessing="true">
<match url="^signalr.*" />
<action type="None" />
</rule>
<!-- greedier rules below -->
C'est juste ici au cas où quelqu'un aurait un problème similaire.