web-dev-qa-db-fra.com

SignalR "signalr/hubs" donnant une erreur 404

J'utilise SignalR (https://github.com/SignalR/SignalR) dans mon projet. A partir d'ici https://github.com/SignalR/SignalR/wiki/QuickStart-Hubs J'ai eu l'idée d'utiliser les hubs. Mais le script "signalr/hubs" génère une erreur 404. Voici l'URL qui devient dans View Source: http: // localhost: 50378/signalr/hubs en donnant une erreur 404

Voici mon code: Hub:

public class Test:Hub
{
    public void Start()
    {
        Caller.guid = Guid.NewGuid();
    }

    public void TestMethod()
    {
        Clients.show("test", Caller.guid);
    }
}

ASPX:

<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Title</title>
        <script src="../Scripts/jquery-1.6.4.min.js" type="text/javascript"></script>
        <script src="../Scripts/jquery.signalR.js" type="text/javascript"></script>
        <script src="<%= ResolveUrl("~/signalr/hubs") %>" type="text/javascript"></script>
        <script type="text/javascript">

            $(document).ready(function () {
                var test = $.connection.test;
                $("#btnTest").click(function () {
                    test.testMethod();
                });
                test.show = function (text, guid) {
                    if (guid != test.guid) //notify all clients except the caller
                        alert(text);
                };
                $.connection.hub.start(function () { test.start(); });
            });

        </script>
    </head>
    <body>
        <form id="HtmlForm" runat="server">
            <div>

            </div>
        </form>
    </body>
</html>

Web.config:

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
....
45
Rocky Singh

Il se peut que vous n'ayez pas ajouté de référence à SignalR.AspNet.dll. Si je me souviens bien, il est responsable de l'ajout de la route à /signalr/hubs.

28
MatteKarla

Essayez d'appeler RouteTable.Routes.MapHubs () avant RouteConfig.RegisterRoutes (RouteTable.Routes) dans Global.asax.cs si vous utilisez MVC 4. Cela fonctionne pour moi.

        RouteTable.Routes.MapHubs();
        RouteConfig.RegisterRoutes(RouteTable.Routes);
44
Adamy

Dans SignalR 1.0.0 RC2 , il existe un README dans le dossier packages indiquant que la route des hubs doit être établie manuellement. :) Voici un extrait ...

using System;
using System.Web;
using System.Web.Routing;

namespace MyWebApplication
{
    public class Global : System.Web.HttpApplication
    {
        public void Application_Start()
        {
            // Register the default hubs route: ~/signalr
            RouteTable.Routes.MapHubs();
        }
    }
}
14
Michael R

J'ai également eu du mal à résoudre ce problème et je suis enfin parvenu au point qui le causait. Tout d’abord, je dois dire que, avec SignalR v2, callingRouteTable.Routes.MapHubs(); de Globalasax/Application_Start est obsolète et que le compilateur émet même un avertissement. Au lieu de cela, nous ajoutons maintenant une classe StartUp dédiée avec la méthode publique suivante:

public void Configuration(IAppBuilder app)
{
    app.MapSignalR();
}

Toute la configuration va ici.Voir la documentation pour plus d'informations.

Maintenant, après avoir perdu de nombreuses heures à googler comme un fou, j'ai décidé de lancer une exception à l'intérieur de la méthode Configure de la classe StartUp que j'ai mentionnée précédemment. Si aucune exception n'était levée, je comprendrais qu'Owin ne commence même pas. Je devinais raison. Pour une raison quelconque, Owin ne commençait pas ou quelque chose la supprimait. Dans mon cas, il s’agissait de ce paramètre de configuration malveillant dans mon fichier web.config:

    <add key="owin:AutomaticAppStartup" value="false" />

Je suppose que le nom du paramètre est assez descriptif. Supprimez-le ou remplacez false par true. 

12
Mikayil Abdullayev

Dans mon cas, la raison principale de cette 404 est que les hubs n'étaient pas correctement mappés. RouteTable.Routes.MapHubs(); est maintenant obsolète. Pour les hubs de mappage, vous pouvez créer une classe de démarrage comme ci-dessous.

[Assembly: OwinStartup(typeof(WebApplication1.Startup))]
namespace WebApplication1
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Any connection or hub wire up and configuration should go here
            app.MapSignalR();
        }
    }
}
12
Chaitanya Gadkari

Vous venez d'installer IIS? Dans ce cas, vous devrez peut-être le réinstaller:

c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
4
Dunken

Vous devez référencer le fichier JavaScript avec @Url.Content, en supposant que vous utilisez ASP.NET MVC3.

Comme:

<script src="@Url.Content("~/Scripts/jquery.signalR.min.js")" type="text/javascript"></script>

Voir le SignalR FAQ sur GitHub

Edit: Comme Trevor De Koekkoek l'a mentionné dans son commentaire, vous n'avez pas besoin d'ajouter @Url.Content vous-même si vous utilisez MVC4 ou une version ultérieure. Préposer simplement l'URI avec ~/ suffit. Pour plus d'informations, consultez cette autre SO question

3
thomaux

J'ai rencontré le même problème lors de l'exécution de mon code à l'aide du serveur de développement Visual Studio et cela fonctionnait lorsque j'ai modifié les paramètres de mon projet pour utiliser le serveur Web local IIS.

enter image description here

David Fowler a commenté le problème soulevé. Le problème sera résolu dans les prochaines versions, mais pour l’instant, il s’agit de la solution de contournement. Je ne trouve pas le lien vers le bogue pour le moment.

3
SecretDeveloper

Longue histoire: dans mon cas, j'ai utilisé R # (ReSharper) , cliquez avec le bouton droit sur mon projet utilisant SignalR, puis sur Refactor => Supprimer les références non utilisées. Attention: ceci est un pousse dans le pied. :RÉ

Il a supprimé les références IMPORTANT DLL de SignalR qui sont utilisées uniquement pendant l'exécution, c'est-à-dire qu'elles ne sont pas nécessaires lors de la compilation. Évidemment, R # ne vérifie que les dépendances à la compilation.

À savoir ces 2 références manquaient:

  1. Microsoft.AspNet.SignalR.SystemWeb
  2. Microsoft.Owin.Host.SystemWeb (sans celui-ci un point d'arrêt dans la méthode de configuration SignalR OWIN ne sera même pas touché).

Suppression des packages NuGet, puis réinstallation de ceux-ci. Correction du problème /hubs 404.

3

Ceci est une réponse complète de SignalR wiki ( https://github.com/SignalR/SignalR/wiki/Faq ). Cela a fonctionné avec moi:

Commencez par vous assurer que vous avez un appel à MapHubs () dans Global.asax.

Assurez-vous que l'itinéraire du hub est enregistré avant tout autre itinéraire de votre application.

RouteTable.Routes.MapHubs();

Dans ASP.NET MVC 4, vous pouvez effectuer les opérations suivantes:

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

Si vous écrivez une application MVC 3, assurez-vous que vous utilisez Url.Content pour vos références de script:

<script type="text/javascript" src="@Url.Content("~/signalr/hubs")"></script>

Si vous écrivez une application ASP.NET normale, utilisez ResolveClientUrl pour vos références de script:

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

Si ce qui précède ne fonctionne toujours pas, assurez-vous que RAMMFAR est défini dans votre web.config:

<configuration>
   <system.webServer>
        <modules runAllManagedModulesForAllRequests="true">
        </modules>
    </system.webServer>
</configuration>
2
Saad

J'ai eu ces erreurs 404 lorsque j'ai mis à jour vers Signalr 2.0 et déployé le projet MVC sur le serveur de production. La publication du projet avec l’option "Supprimer tous les fichiers existants avant la publication" a permis d’enregistrer mes problèmes.

espérons que cela aide quelqu'un.

1
arun.m

A noter peut-être que j’exécute une application Web Forms qui utilise son propre routage manuel. Étant donné que le démarrage d’OWIN a lieu après la définition des tables de routage, la route pour/signalr/hubs n’a jamais été touchée. J'ai ajouté une règle pour ignorer les itinéraires (IE: laissez les formulaires Web effectuer le routage) sur tous les chemins commençant par "/ signalr". Cela a résolu mon problème.

1
Howard

J'ai moi aussi rencontré le même problème dans une application ASP.NET 4.0 Web Forms. Cela fonctionnait sur les serveurs de développement, mais pas dans les environnements de production ... La solution consistant à garantir que toutes les requêtes/modules s'exécutaient en mode géré n'était pas acceptable pour nous.

La solution que nous avons trouvée (de préférence pour ASP.NET Web Forms) est la suivante .. Ajoutez la section suivante à Web.Config:

<modules>
  <remove name="UrlRoutingModule-4.0" />
  <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
  <!-- any other modules you want to run in MVC e.g. FormsAuthentication, Roles etc. -->
</modules>
1
Don

Mon projet est l’application Web ASP.net 4.0 C #, l’environnement de test est Windows Server 2012.

J'ai eu le même problème avec 1.0.0 RC2, j'ai fait ce que Michael suggère et cela fonctionne. Merci.

@MatteKarla: lors de l'installation de SignalR 1.0.0 RC2 par NuGet, les références suivantes sont ajoutées au projet:

  • Microsoft.AspNet.SignalR.Core
  • Microsoft.AspNet.SignalR.Owin
  • Microsoft.AspNet.SignalR.SystemWeb
  • Microsoft.Owin.Host.SystemWeb

Je dois ajouter Microsoft.CSharp manuellement ou l'erreur suivante sera survenue pendant la compilation:

  • Le type prédéfini 'Microsoft.CSharp.RuntimeBinder.Binder' n'est pas défini ni importé
1
Vinix

peut-être parce que le nom de votre classe de concentrateur est "Test" et que vous faites référence à "test" côté client.

0
Ujjwal Kumar Gupta

J'ai résolu ce problème en passant de la version 2.0 à la version 4.0 du pool d'applications.

0
MichaelAttard

Pour moi, la solution consistait à réinstaller tous les packages et à restaurer toutes les dépendances.

Ouvrez Nuget Powershell et utilisez cette commande.

Update-Package -Reinstall
0

l'ajout de app.MapSignalR(); dans la classe Startup résout le problème

0
Kamran Qadir

vous n’avez pas besoin du fichier signalr/hubs, c’est juste pour avoir un débogage plus facile et un moyen simple d’appeler une fonction. voir: Voir ce que le proxy généré fait pour vous , c'est tout. Les choses fonctionneront sans elle. 

0
saju