webentwicklung-frage-antwort-db.com.de

signalR:/SignalR/Hubs wird nicht generiert

Ich kann dieses Tutorial dazu bringen, in einem neuen Projekt zu arbeiten, aber nicht in meinem bestehenden Projekt.

Mein Projekt ist eine ASP.Net MVC 4-Webanwendung mit dem folgenden Attribut in der Datei web.config:

<appSettings>
  <add key="webpages:Enabled" value="true"/>
</appSettings>

Dies liegt daran, dass meine Anwendung eine Single-Page-Application ist, die AngularJS auf der Clientseite verwendet. Die einzige Seite in meiner Anwendung ist index.cshtml, zu der ich den relevanten Code für signalR hinzugefügt habe:

 <!-- signalR chat -->
<script src="~/Scripts/jquery.signalR-1.0.0.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src="/signalr/hubs"></script>
<!--Add script to update the page and send messages.--> 
<script type="text/javascript">
    $(function () {
        // Declare a proxy to reference the hub. 
        var chat = $.connection.chatHub;
        // Create a function that the hub can call to broadcast messages.
        chat.client.broadcastMessage = function (name, message) {
            // Html encode display name and message. 
            var encodedName = $('<div />').text(name).html();
            var encodedMsg = $('<div />').text(message).html();
            // Add the message to the page. 
            $('#discussion').append('<li><strong>' + encodedName
                + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
        };
        // Get the user name and store it to prepend to messages.
        $('#displayname').val(Prompt('Enter your name:', ''));
        // Set initial focus to message input box.  
        $('#message').focus();
        // Start the connection.
        $.connection.hub.start().done(function () {
            $('#sendmessage').click(function () {
                // Call the Send method on the hub. 
                chat.server.send($('#displayname').val(), $('#message').val());
                // Clear text box and reset focus for next comment. 
                $('#message').val('').focus();
            });
        });
    });
</script>

Dann habe ich die Datei ChatHub.cs:

public class ChatHub : Hub
{
    public void Send(string name, string message)
    {
        // Call the broadcastMessage method to update clients.
        Clients.All.broadcastMessage(name, message);
    }
}

Und zum Schluss in der global.asax:

 protected void Application_Start()
    {
        RouteTable.Routes.MapHubs();
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

Beim Ausführen der Anwendung wird die Datei/signalr/hubs nicht generiert. Ich bekomme eine 404, wenn ich die Datei anfordert, und sie stürzt in der Zeile ab:

 chat.client.broadcastMessage = function (name, message) { ....

weil chat null ist, da die vorherige Zeile chatHub nicht gefunden hat:

var chat = $.connection.chatHub;

Weiß jemand, was mit meinem Code falsch ist? 

UPDATE

Ich habe mein Problem durch Ändern der Zeile gelöst:

<script src="/signalr/hubs"></script>

zu 

<script src="~/signalr/hubs"></script>
22
Sam

Ich habe mein Problem durch Ändern der Zeile gelöst:

<script src="/signalr/hubs"></script>

zu

<script src="~/signalr/hubs"></script>
16
Sam

Der Grund, warum/signalr/hubs nicht generiert wird, ist das Zuordnen von SignalR in der OWIN-Startkonfiguration.

public class Startup
{
   public void Configuration(IAppBuilder appBuilder){
         ...
         appBuilder.MapSignalR();
         ...
   }
 ...
6

In meinem Fall war dies darauf zurückzuführen, dass meine ChatHub-Klasse nicht als öffentlich markiert wurde.

2

Ich hatte ein ähnliches Problem, bei dem die Hub-Datei nicht generiert wurde. Es sieht so aus, als ob das OP den Schritten hier folgend folgte. Die Art und Weise, wie ich das Problem gelöst habe, hatte mit der Jquery zu tun. Das Tutorial, das ich unten verlinkt habe, wurde mit jquery 1.6.4 und jquery-signalr Version 2.1.0 geschrieben. Als Visual Studio den Scripts-Ordner für mich generiert hat, wurde Jquery-Version 1.10.2 und Jquery-Signalr-Version 2.0.2 verwendet.

Wie ich das behoben habe, war einfach die index.html-Datei zu bearbeiten. Beachten Sie, dass Sie das JavaScript-Konsolenfenster von Chrome mit Strg + Umschalt + J verwenden können, um Fehler anzuzeigen.

1
user2023861

Für mich bestand die Lösung darin, alle packages neu zu installieren und alle Abhängigkeiten wiederherzustellen.

Verwenden Sie in Nuget Powershell Console diesen Befehl.

Update-Package -Reinstall

Ich möchte gerne hinzufügen, dass die Readme-Datei von signalR einige Hinweise zu diesem Problem enthält .. und auch, wenn sich Ihre signalR-Seite in einer PartialView befindet, sollte ein Skript auf der Masterseite platziert werden.

Please see http://go.Microsoft.com/fwlink/?LinkId=272764 for more information on using SignalR.

Upgrading from 1.x to 2.0
-------------------------
Please see http://go.Microsoft.com/fwlink/?LinkId=320578 for more information on how to 
upgrade your SignalR 1.x application to 2.0.

Mapping the Hubs connection
----------------------------
To enable SignalR in your application, create a class called Startup with the following:

using Microsoft.Owin;
using Owin;
using MyWebApplication;

namespace MyWebApplication
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
} 

Getting Started
---------------
See http://www.asp.net/signalr/overview/getting-started for more information on how to get started.

Why does ~/signalr/hubs return 404 or Why do I get a JavaScript error: 'myhub is undefined'?
--------------------------------------------------------------------------------------------
This issue is generally due to a missing or invalid script reference to the auto-generated Hub JavaScript proxy at '~/signalr/hubs'.
Please make sure that the Hub route is registered before any other routes in your application.

In ASP.NET MVC 4 you can do the following:

      <script src="~/signalr/hubs"></script>

If you're writing an ASP.NET MVC 3 application, make sure that you are using Url.Content for your script references:

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

If you're writing a regular ASP.NET application use ResolveClientUrl for your script references or register them via the ScriptManager 
using a app root relative path (starting with a '~/'):

    <script src='<%: ResolveClientUrl("~/signalr/hubs") %>'></script>

If the above still doesn't work, you may have an issue with routing and extensionless URLs. To fix this, ensure you have the latest 
patches installed for IIS and ASP.NET. 
0
Hugo

In meinem Fall fehlte mir:

        app.MapSignalR();

in public void Configuration(IAppBuilder app) Funktion in startup.cs

0
Badr Bellaj