2017-02-08 42 views
1

我正在嘗試創建一個簡單的SignalR測試項目;但是,它的表現並不像我認爲的那樣。我有一個網站用下面的代碼:信號測試項目未按預期工作

namespace SignalRTest3 
{     
    public class MyHub1 : Hub 
    { 
        public void Hello(string message) 
        { 
            Clients.All.Hello(); 
             
        } 
    } 
} 

Startup.cs:

[assembly: OwinStartupAttribute(typeof(SignalRTest3.Startup))] 
namespace SignalRTest3 
{ 
    public partial class Startup 
    { 
        public void Configuration(IAppBuilder app) 
        { 
            ConfigureAuth(app); 

      app.UseCors(CorsOptions.AllowAll); 
            app.MapSignalR(); 
        } 
    } 
} 

我已經改變了索引頁:

<body> 
    <!-- HTML Content --> 

    <script type="text/javascript" src="~/Scripts/jquery-1.10.2.min.js"></script> 
    <script type="text/javascript" src="~/Scripts/jquery.signalR-2.1.2.min.js"></script> 
    <script type="text/javascript" src="~/signalr/hubs"></script> 
    <script type="text/javascript" src="~/Scripts/SignalRTest.js"></script> 
    <div class="jumbotron"> 
        <h1>SignalR Test</h1> 
    </div> 
</body> 

而且JS文件上面提到的是:

$(function () { 
    // Declare a proxy to reference the hub.  
    var hub = $.connection.MyHub1; 

    // Create a function that the hub can call to broadcast messages. 
    hub.client.Hello = function (message) { 

        alert(message); 
    }; 

    hub.start(); 
}); 

因此,意圖我當接收到通知時,該站點將顯示警報。要達到這種效果,我有一個控制檯應用程序:

class Program 
{ 
    static void Main(string[] args) 
    { 
        Console.Write("Message: "); 
        string message = Console.ReadLine(); 

        HubConnection connection = new HubConnection("http://localhost:4035/"); 
        IHubProxy hub = connection.CreateHubProxy("MyHub1"); 
        connection.Start().Wait(); 
        hub.Invoke<string>("Hello", message).Wait();             
    } 
} 

所以我鍵入消息,可以看到,在輪轂火災的代碼,但它看起來像有一些錯誤的JavaScript和集線器之間的連線;請有人指出我正確的方向?

編輯:修改方法簽名和hub.start按JPThorne的建議

編輯:使用CORS試過,但無濟於事

它看起來像這個問題可能與代理;我得到的F12控制檯窗口中下面的輸出:

Uncaught TypeError: Cannot read property 'MyHub1' of undefined 
    at HTMLDocument.<anonymous> (VM456 SignalRTest.js:3) 
    at c (jquery-1.10.2.min.js:21) 
    at Object.fireWith [as resolveWith] (jquery-1.10.2.min.js:21) 
    at Function.ready (jquery-1.10.2.min.js:21) 
    at HTMLDocument.q (jquery-1.10.2.min.js:21) (anonymous) @ VM456 SignalRTest.js:3 c @ jquery-1.10.2.min.js:21 fireWith @ jquery-1.10.2.min.js:21 ready @ jquery-1.10.2.min.js:21 q @ jquery-1.10.2.min.js:21 

UPDATE:

感謝來自JPThorne幫助,我終於跟蹤下來的BundleConfig文件;礦山看起來像這樣:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
      "~/Scripts/jquery-{version}.js")); 

bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
      "~/Scripts/jquery.validate*")); 
// Use the development version of Modernizr to develop with and learn from. Then, when you're 
// ready for production, use the build tool at http://modernizr.com to pick only the tests you need. 
bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
      "~/Scripts/modernizr-*")); 

bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
      "~/Scripts/bootstrap.js", 
      "~/Scripts/respond.js")); 

bundles.Add(new StyleBundle("~/Content/css").Include(
      "~/Content/bootstrap.css", 
      "~/Content/site.css")); 

,盡我所能收集,用於{}版本上~/Scripts/jquery-{version}.js正則表達式也拿起SignalR腳本太早!

+0

一個簡單的問題,這兩個代碼都在同一個項目或兩個不同的項目,因爲IMO似乎是一個基於控制檯的應用程序,另一個是基於Web的。它是否正確? – Prabhat

+0

是 - 單獨的應用程序。用於發送消息的控制檯應用程序以及用於顯示該消息的Web應用程序 –

+2

您也允許CORS很重要。請參閱https://docs.microsoft.com/zh-cn/aspnet/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client – Tester

回答

1

您還需要在客戶端啓動集線器。那麼,這對我們很有用。你可以試試這個:

$.connection.hub 
    .start() 
    .done(function() { console.log("Hub started"); }) 
    .fail(function() { console.log("Error: could not connect"); }); 

另外,我發現下面的聽衆得心應手:

$.connection.hub.connectionSlow(function() { 
    console.log("We are currently experiencing difficulties with the connection."); 
}); 

$.connection.hub.error(function (error) { 
    console.log("SignalR error: ", error); 
}); 

更新#1: 我將您的服務器上改變Clients.All.hello();Clients.All.hello(message);

然後在FE更改hub.client.Hello = function (name, message)hub.client.Hello = function (message)

UPDATE#2 : 地址: [HubName("MyHub1")]以上public class MyHub1 : Hub

更新#3:

好了,所以我想你的版本,而且也確實存在一些問題。

  1. 不要找這樣開始:hub.start();這樣稱呼它:$.connection.hub.start();
  2. 您可能需要升級到jQuery的最新版本。
  3. 確保你在SignalRTest.js之上引用了jquery - 這就是爲什麼你得到'不能讀取上面未定義'屬性的錯誤。
+0

看來,雖然這可能是正確的,但並不是完整的答案(仍然沒有得到警報)。 –

+0

好了,看你的代碼,再次我看到: 公共無效你好(字符串消息)和 hub.client.Hello =功能(姓名,消息){ 所以......你不使用第一個字符串消息 - 你沒有通過它。在前端腳本中,您還有一個額外的名稱參數。 檢查我更新的答案。參數必須匹配。 – JPThorne

+0

試過了。我甚至嘗試玩這個方法(Hello/hello),但沒有骰子。 –