0

My MVC-5 AzureホストのWeb App(VS 2013/VB)技術は、必要なSignalR/hubs JavaScriptページを作成していないようです。リソースを読み込めませんでした:http://website.azurewebsites.net/signalr/hubsサーバーが404のステータスで応答しました(Not Found)

は、ここですべての詳細です:

まず、私はアズール/ signalr /ハブのソースページの作成を許可しないだろうと信じているので、私は私自身のSignalRテストアプリからサンプルハブページを「盗みました」。次に、WebアプリのScripts/Customフォルダにsignalr.jsファイルを追加しました。ここでは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)); 

は今、私が知っている私が設定したクラス内の関数へのプロキシマップ。しかし、私は非常に大きなアプリを与えて、これを行う方法を正確にはわかりません。本質的には、プロジェクトにいくつかのクラスを追加しただけなので、それらはルートフォルダにあります。そして、Startup.vbファイルで、私はこれを行います。

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 

その後、ロベルトベスパでSignalRリアルタイムアプリケーションクックブックという本あたりに、私は私のアプリのルートフォルダに以下のクラスを追加しました。 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 

これは、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 

最後に、私の見解では、

@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> 

しかし、私が実行すると、(Chromeで)取得します。 http://mywebsite.azurewebsites.net/Scripts/Custom/signalr.js/negotiate?clientProtocol=1.5&connectionData= ... は、リソースの読み込みに失敗しました:サーバーは、404の状態で応答し...

を私は他の中で、signalr.jsファイルを設定するなど、私のコードで間違っていくつかのことを、持って知っていますもの。助けてください。

答えて

0

SignalRアプリケーションはローカル環境で動作しますか?それともAzure側でのみ動作しませんか?一般的な404の問題については、Global.asaxのMapHubs()への呼び出しがあることを確認し、アプリケーションの他のルートの前にハブルートが登録されていることを確認してください。 ASP.NET MVC3を使用していると仮定して、JavaScriptファイルを@ Url.Contentで参照します。 ASP.NET MVC 4で

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

次の操作を実行できます。

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

これは、Azureの側の問題である場合は、SignalRの関連を確認してくださいSignalR FAQ on GitHub

を参照してください。ファイルはKUDUツールを介してAzure側にアップロードされています。また、websocketがthis articleによって有効になっているかどうかも確認してください。

+0

ウェブソケットがオンになっています。私はローカル側でのみプロダクション側で働いていますが、localhost上でタイマーを実行するSignalRアプリケーションを作成しても問題ありません。 MapHubsはMVC-4の残りの部分です。 StartupのConfiguration Subのapp.MapSignalR()を実行することは、MVC-5で必要とされるすべてです。これは私が使用しているものです(タイトルを参照)。自分のJSハブを作成してScripts/custom/signalr.jsに入れました。私のデータはAzure ServiceBus Queue上にあるのでScaleoutMessageBusを使用しようとしていますが、何もできません。 – user713723

+0

私の上記の編集を参照してください。私はそれがsignalrと私の問題に関連するすべての情報を含んでいると思います。ありがとう。 – user713723

関連する問題