2017-02-08 16 views
1

Я пытаюсь создать простой тестовый проект SignalR; однако он не ведет себя так, как я считаю. У меня есть веб-сайт, с помощью следующего кода:Проект тестирования 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(); 
}); 

Итак, намерение i что при получении уведомления на сайте появится предупреждение. Для запуска этого, у меня есть консольное приложение:

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();             
    } 
} 

Так я набираю сообщение, и можно увидеть, что код в ступицах пожаров, но это выглядит как-то не так с проводкой между яваскриптом и ступицей ; пожалуйста, может кто-нибудь указать мне в правильном направлении?

EDIT: изменить метод подписи и hub.start согласно предложению JPThorne в

EDIT: пытались использовать 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 - это консольное приложение, а другое - веб-приложение. Это верно? – Prabhat

+0

Да - отдельные приложения. Консольное приложение для отправки сообщения и веб-приложение для его отображения –

+2

Важно, чтобы вы также разрешили CORS. См. Https://docs.microsoft.com/en-us/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); 
}); 

UPDATE # 1: Я хотел бы изменить Clients.All.hello(); на сервере, чтобы быть Clients.All.hello(message);

, а затем при изменении FE hub.client.Hello = function (name, message) до hub.client.Hello = function (message)

ОБНОВЛЕНИЕ # 2 : Добавить: [HubName("MyHub1")] выше public class MyHub1 : Hub

UPDATE # 3:

Ok поэтому я попробовал версию, и есть несколько проблем, на самом деле.

  1. Не называйте начать так: hub.start(); называют это так: $.connection.hub.start();
  2. Вы можете обновить его до последней версии JQuery.
  3. Убедитесь, что вы ссылаетесь на jquery над вашим SignalRTest.js - вот почему вы получаете сообщение об ошибке «Невозможно прочитать свойство неопределенной» выше.
+0

Казалось бы, хотя это может быть правильно, это не весь ответ (все еще не получающий предупреждение). –

+0

Итак, глядя на ваш код еще раз, что я вижу: общественного недействительными Hello (строка сообщения) и hub.client.Hello = функция (имя, сообщение) { так ... вы не используете первое строковое сообщение - вы не проходите его. А на интерфейсном скрипте у вас есть дополнительное имя param. Проверьте обновленный ответ. Параметры должны совпадать. – JPThorne

+0

Пробовал, что. Я даже попытался сыграть со случаем метода (Hello/hello), но не кубиками. –