0

Mon application Web hébergée sur MVC-5 Azure (VS 2013/VB) à l'aide de SignalR la technologie ne semble pas créer la page JavaScript SignalR/hubs nécessaire.Impossible de charger la ressource: le serveur http://website.azurewebsites.net/signalr/hubs a répondu avec un statut de 404 (introuvable)

est ici tous les détails:

d'abord, car je crois que Azure ne permettra pas la création du/signalr/moyeux page source, I « volé » une page de plaque tournante exemple de ma propre application de test de SignalR. J'ai ensuite ajouté un fichier signalr.js dans le dossier Scripts/Custom de mon application web. Voici le fichier JavaScript:

(function ($, window, undefined) { 
    /// <param name="$" type="jQuery" /> 
    "use strict"; 

    if (typeof ($.signalR) !== "function") { 
     throw new Error("SignalR: SignalR is not loaded. Please ensure jquery.signalR-x.js is referenced before ~/signalr/js."); 
    } 

    var signalR = $.signalR; 

    function makeProxyCallback(hub, callback) { 
     return function() { 
      // Call the client hub method 
      callback.apply(hub, $.makeArray(arguments)); 
     }; 
    } 

    function registerHubProxies(instance, shouldSubscribe) { 
     var key, hub, memberKey, memberValue, subscriptionMethod; 

     for (key in instance) { 
      if (instance.hasOwnProperty(key)) { 
       hub = instance[key]; 

       if (!(hub.hubName)) { 
        // Not a client hub 
        continue; 
       } 

       if (shouldSubscribe) { 
        // We want to subscribe to the hub events 
        subscriptionMethod = hub.on; 
       } else { 
        // We want to unsubscribe from the hub events 
        subscriptionMethod = hub.off; 
       } 

       // Loop through all members on the hub and find client hub functions to subscribe/unsubscribe 
       for (memberKey in hub.client) { 
        if (hub.client.hasOwnProperty(memberKey)) { 
         memberValue = hub.client[memberKey]; 

         if (!$.isFunction(memberValue)) { 
          // Not a client hub function 
          continue; 
         } 

         subscriptionMethod.call(hub, memberKey, makeProxyCallback(hub, memberValue)); 
        } 
       } 
      } 
     } 
    } 

    $.hubConnection.prototype.createHubProxies = function() { 
     var proxies = {}; 
     this.starting(function() { 
      // Register the hub proxies as subscribed 
      // (instance, shouldSubscribe) 
      registerHubProxies(proxies, true); 

      this._registerSubscribedHubs(); 
     }).disconnected(function() { 
      // Unsubscribe all hub proxies when we "disconnect". This is to ensure that we do not re-add functional call backs. 
      // (instance, shouldSubscribe) 
      registerHubProxies(proxies, false); 
     }); 

     proxies['bpHub'] = this.createHubProxy('bpHub'); 
     proxies['bpHub'].client = {}; 
     proxies['bpHub'].server = { 
      begin: function() { 
       return proxies['bpHub'].invoke.apply(proxies['bpHub'], $.merge(["new"], $.makeArray(arguments))); 
      }, 

      hello: function() { 
       return proxies['bpHub'].invoke.apply(proxies['bpHub'], $.merge(["send"], $.makeArray(arguments))); 
      }, 

      helloServer: function() { 
       return proxies['bpHub'].invoke.apply(proxies['bpHub'], $.merge(["broadcast"], $.makeArray(arguments))); 
      } 
     }; 

     return proxies; 
    }; 

    signalR.hub = $.hubConnection("/signalr", { useDefaultPath: false }); 
    $.extend(signalR, signalR.hub.createHubProxies()); 

}(window.jQuery, window)); 

Maintenant, je sais que la carte des procurations à des fonctions dans les classes que je mis en place. Mais je ne suis pas tout à fait sûr exactement comment faire cela, compte tenu de ma très grande application. Pour l'essentiel, j'ai simplement ajouté quelques classes au projet, elles sont donc dans le dossier racine. Et puis dans le fichier Startup.vb, je fais ceci;

Imports Microsoft.Owin 
Imports Owin 
Imports Microsoft.AspNet.SignalR 

<Assembly: OwinStartup(GetType(Startup))> 
Public Class Startup 
    Public Sub Configuration(app As IAppBuilder) 
     Dim cn As String = ConfigurationManager.ConnectionStrings("AzureServiceBus").ConnectionString 

     GlobalHost.DependencyResolver.UseServiceBus(cn, "dtxEarth3") 

     app.MapSignalR() 
    End Sub 
End Class 

Ensuite, selon le livre intitulé SignalR application temps réel livre de recettes par Roberto Vespa, j'ai ajouté les classes suivantes dans le dossier racine de mon application; sigRmb.vb;

Imports System.Collections.Generic 
Imports System.Threading.Tasks 
Imports Microsoft.AspNet.SignalR 
Imports Microsoft.AspNet.SignalR.Client 
Imports Microsoft.AspNet.SignalR.Messaging 
Imports Microsoft.AspNet.SignalR.Hubs 

<HubName("bpHub")> 
Public Class SignalRBackplaneMessageBus 
    Inherits ScaleoutMessageBus 
    Private ReadOnly _connection As HubConnection 
    Private ReadOnly _hub As IHubProxy 

    Public Sub New(dependencyResolver As IDependencyResolver, configuration As SignalRBackplaneConfiguration) 
     MyBase.New(dependencyResolver, configuration) 

     _connection = New HubConnection(configuration.EndpointAddress) 

     _hub = _connection.CreateHubProxy("bpHub") 

     _hub.[On](Of Byte())("broadcast", Function(m) 
               Dim message = SignalRBackplaneMessage.FromBytes(m) 
               OnReceived(0, message.Id, message.ScaleoutMessage) 

              End Function) 

     _connection.Start().Wait() 
    End Sub 

    Protected Overrides Function Send(streamIndex As Integer, messages As IList(Of Message)) As Task 
     Return Send(messages) 
    End Function 

    Protected Overrides Function Send(messages As IList(Of Message)) As Task 
     If _connection.State <> ConnectionState.Connected Then 
      Return Task.FromResult(False) 
     End If 

     Dim newId = _hub.Invoke(Of Long)("GetId").Result 

     Dim data = SignalRBackplaneMessage.ToBytes(newId, messages) 

     Return _hub.Invoke("Publish", data) 
    End Function 
End Class 

sigRconfig;

Imports Microsoft.AspNet.SignalR.Messaging 

Public Class SignalRBackplaneConfiguration 
    Inherits ScaleoutConfiguration 

    Private m_EndpointAddress As String = "Endpoint=sb://dtxdrill-ns.servicebus.windows.net/;SharedAccessKeyName=RigMon100;SharedAccessKey=U7/6C+1y1kExpCMVgG+1tZpvz6um/d4NOiucComR/CU=" 

    Public Property EndpointAddress() As String 
     Get 
      Return m_EndpointAddress 
     End Get 
     Set(value As String) 
      m_EndpointAddress = value 
     End Set 
    End Property 
End Class 

sigRbm;

Imports System.Collections.Generic 
Imports System.IO 
Imports Microsoft.AspNet.SignalR.Messaging 

Public Class SignalRBackplaneMessage 
    Private m_Id As ULong 
    Private m_ScaleoutMessage As ScaleoutMessage 

    Public Property Id() As ULong 
     Get 
      Return m_Id 
     End Get 
     Private Set(value As ULong) 
      m_Id = value 
     End Set 
    End Property 

    Public Property ScaleoutMessage() As ScaleoutMessage 
     Get 
      Return m_ScaleoutMessage 
     End Get 
     Private Set(value As ScaleoutMessage) 
      m_ScaleoutMessage = value 
     End Set 
    End Property 

    Public Shared Function ToBytes(id As Long, messages As IList(Of Message)) As Byte() 
     If messages Is Nothing Then 
      Throw New ArgumentNullException("messages") 
     End If 

     Using ms = New MemoryStream() 
      Dim binaryWriter = New BinaryWriter(ms) 

      Dim scaleoutMessage = New ScaleoutMessage(messages) 
      Dim buffer = scaleoutMessage.ToBytes() 

      binaryWriter.Write(id) 
      binaryWriter.Write(buffer.Length) 
      binaryWriter.Write(buffer) 

      Return ms.ToArray() 
     End Using 
    End Function 

    Public Shared Function FromBytes(data As Byte()) As SignalRBackplaneMessage 
     Using stream = New MemoryStream(data) 
      Dim binaryReader = New BinaryReader(stream) 
      Dim id = CULng(binaryReader.ReadInt64()) 
      Dim count = binaryReader.ReadInt32() 
      Dim buffer = binaryReader.ReadBytes(count) 

      Return New SignalRBackplaneMessage() With { _ 
       .Id = id, _ 
       .ScaleoutMessage = ScaleoutMessage.FromBytes(buffer) _ 
      } 
     End Using 
    End Function 
End Class 

Et celui-ci, appelé sigR_DependencyResolverExtensions.vb;

Imports System.Runtime.CompilerServices 
Imports Microsoft.AspNet.SignalR 
Imports Microsoft.AspNet.SignalR.Messaging 

Module sigR_DependencyResolverExtensions 
    <System.Runtime.CompilerServices.Extension> _ 
    Public Sub UseSignalRBackplane(resolver As IDependencyResolver, endpointAddress As String) 
     resolver.UseSignalRBackplane(New SignalRBackplaneConfiguration() With { _ 
      .EndpointAddress = endpointAddress _ 
     }) 
    End Sub 

    <System.Runtime.CompilerServices.Extension> _ 
    Public Sub UseSignalRBackplane(resolver As IDependencyResolver, configuration As SignalRBackplaneConfiguration) 
     resolver.Register(GetType(IMessageBus), Function() New SignalRBackplaneMessageBus(resolver, configuration)) 
    End Sub 
End Module 

Et enfin, à mon avis, j'ai;

@Code 
    Layout = Nothing 
End Code 

<!DOCTYPE html> 

<html> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
    <title>Drillers Readout - HTI Job #@ViewBag.JobNumber</title> 
    <style> 
     #messages li { 
      list-style-type: none; 
     } 
    </style> 
    @Styles.Render("~/Content/css") 
    @Styles.Render("~/Content/themes/base/css") 
    @Scripts.Render("~/bundles/modernizr") 
    @Scripts.Render("~/bundles/jquery") 
    @Scripts.Render("~/bundles/bootstrap") 
    @Scripts.Render("~/bundles/jqueryui") 
    @Scripts.Render("~/bundles/signalR") 
    <script src="~/Scripts/jquery.signalR-2.2.1.js"></script> 
    <script src="~/Scripts/jquery.signalR-2.2.1.min.js"></script> 
    <script src="~/Scripts/Custom/signalr.js"></script> 
    <script type="text/javascript"> 
     $(function() { 
      //var cn = $.hubConnection(); 
      $.connection.hub.url = "@Url.Content("~/Scripts/Custom/signalr.js")"; 
      var hub = $.connection.bpHub; 

      $.connection.hub.start().done(function() { 
       alert('okay 1'); 
      }) 
       .fail(function(e) { 
       alert('uh-oh! Connection Error ' + e); 
      }); 

      //var myProxy = cn.createHubProxy('bpHub'); 

      //var backplane = cn.backplane; 

      //myProxy.on('broadcast', function (message) { 
      // $('#messages').prepend($('<li/>').text(message)); 
      //}); 

      //cn.start().done(function() { 
      // myProxy.invoke('new'); 
      //}) 
     }); 
    </script> 
</head> 
<body> 
    @*<span id="newTime"></span><br /> 
    <input type="button" id="btnClick" value="Send Message" /><br /> 
    <span id="message"></span>*@ 
    <ul id="messages"></ul> 
</body> 
</html> 

Mais quand je l'exécute, j'obtiens (dans Chrome); http://mywebsite.azurewebsites.net/Scripts/Custom/signalr.js/negotiate?clientProtocol=1.5&connectionData= ... Impossible de charger la ressource: le serveur a répondu avec un état 404 ...

Je sais que j'ai plusieurs mauvaises choses avec mon code, y compris la mise en place du fichier signalr.js, entre autres des choses. S'il vous plaît aider.

Répondre

0

Est-ce que votre application SignalR fonctionne sur votre environnement local? Ou cela ne fonctionne pas dans le côté Azure? Pour le problème général 404, veuillez vous assurer que vous avez un appel à MapHubs() dans Global.asax, et assurez-vous que l'itinéraire Hub est enregistré avant toute autre route dans votre application. Référencez le fichier JavaScript avec @ Url.Content, en supposant que vous utilisez ASP.NET MVC3.

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

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

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

Voir la SignalR FAQ on GitHub

Si cela est question de côté Azure, assurez-vous que la S'il vous plaît SignalR connexes Les fichiers ont été téléchargés vers le côté Azure via l'outil KUDU. En outre, vérifiez également si websocket est activé via this article.

+0

Les Websockets sont activées. Je travaille uniquement en production (jamais locale), bien que j'ai créé une application SignalR qui exécute un timer sur localhost et ça marche bien. Le MapHubs est un vestige de MVC-4; faire app.MapSignalR() dans la configuration de démarrage Sub est tout ce qui est nécessaire dans MVC-5, je crois, qui est ce que j'utilise (voir le titre). J'ai créé mon propre hub JS et je l'ai mis dans Scripts/custom/signalr.js. J'essaye d'employer ScaleoutMessageBus puisque mes données sont sur une file d'attente Azure ServiceBus, mais je ne peux rien obtenir au travail. – user713723

+0

S'il vous plaît voir ma modification approfondie, ci-dessus. Je pense qu'il contient toutes les informations relatives à signalr et mes problèmes. Merci. – user713723