SignalR .NET Client Invoke создает исключение - PullRequest
2 голосов
/ 12 марта 2012

Я пытаюсь заставить консольное приложение работать с клиентом SignalR .Net, но я получаю сообщение об ошибке при попытке вызвать метод на концентраторе.Вот мой код для консольного приложения:

static void Main(string[] args)
{            
    var connection = new HubConnection("http://localhost/SignalRTest");
    var myHub = connection.CreateProxy("SignalRTest.Classes.service");

    myHub.On<string>("addMessage", text =>
    {
        Console.WriteLine(text);
    });

    connection.Start().ContinueWith(task =>
    {
        if (task.IsFaulted)
        {   
            Console.WriteLine("There was an error opening the connection: {0}", task.Exception.GetBaseException());
        }
        else {                        
            Console.WriteLine("Connected.");
        }
   }).Wait();


   myHub.Invoke("Send", "Message from console.").ContinueWith(task => {
       if (task.IsFaulted)
       {                
           Console.WriteLine("There was an error calling Send: {0}", task.Exception.GetBaseException());
       }
       else
       {
           Console.WriteLine("Send complete.");
       }

   });


   Console.ReadLine();

}

Вот хаб с сервера:

[HubName("service")]
public class ServiceHub : Hub
{
    public void Send(string message)
    {
        // Call the addMessage method on all clients
        Clients.addMessage(message);
    }
}

Я предполагаю, что консольное приложение подключается правильно, потому что оно пишет «Подключено»."Но когда он пытается вызвать метод Send на сервере, я получаю следующую ошибку:

System.Net.WebException: удаленный сервер возвратил ошибку: (500) Internal Server Error.в System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult) в SignalR.HttpHelper. <> c_ DisplayClass2.b _0 (IAsyncResult ar) в System.Threading.Tasks.TaskSet1 tcs)

Может кто-нибудь сказать мне, что я делаю не так?Спасибо.

Ответы [ 3 ]

4 голосов
/ 13 марта 2012

Эта проблема, по-видимому, вызвана использованием неверного имени концентратора (при использовании CreateProxy). Странно, что метод запуска не дает сбоя, но я только что проверил это и получил то же поведение, что и вы, используя несуществующее имя концентратора.

0 голосов
/ 21 июня 2018

Для меня это было результатом того, что мой концентратор SignalR потребовал параметр внедрения зависимости.Ошибка становится довольно хорошо скрытой, даже если для ShowDetailedErrors установлено значение true, она была скрыта, кроме как в журналах сервера Azure.

Полученная ошибка выглядит примерно так:

System.MissingMethodException:
   at System.RuntimeTypeHandle.CreateInstance (mscorlib, Version=4.0.0.0, 
   Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.RuntimeType.CreateInstanceSlow (mscorlib, Version=4.0.0.0, 
   Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.RuntimeType.CreateInstanceDefaultCtor (mscorlib, Version=4.0.0.0, 
   at Microsoft.AspNet.SignalR.Hubs.DefaultHubActivator.Create 
   (Microsoft.AspNet.SignalR.Core, Version=2.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)

Как вы можете видеть, я использовал DefaultHubActivator, который не знает, как управлять параметрами инжектора.Итак, я следовал этому хорошему совету, который научил меня, как делать инъекцию с использованием Unity.

Основы в том, что вам нужно написать свой собственный активатор-концентратор, но вы можете наследовать от стандартного ипросто расширьте его, чтобы избежать необходимости регистрировать десятки зависимостей, которые есть у SignalR.

 public class SignalRUnityDependencyResolver : DefaultDependencyResolver
{
    private readonly IUnityContainer _container;
    public SignalRUnityDependencyResolver(IUnityContainer container)
    {
        _container = container ?? throw new ArgumentNullException(nameof(container));
    }

    public override object GetService(Type serviceType)
    {
        return _container.IsRegistered(serviceType) ? _container.Resolve(serviceType) : base.GetService(serviceType);
    }

    public override IEnumerable<object> GetServices(Type serviceType)
    {
        return _container.IsRegistered(serviceType) ? _container.ResolveAll(serviceType) : base.GetServices(serviceType);
    }
}

После чего вы устанавливаете его в своем автозагрузке

app.Map("/signalr", map =>
        {
            var hubConfiguration = new HubConfiguration()
            {
                EnableJSONP = true,
                EnableDetailedErrors = true,
                Resolver = new SignalRUnityDependencyResolver(UnityConfig.GetContainer())
            };
            map.RunSignalR(hubConfiguration);
            logger.WriteInfo("Started signalr.");
        });

Наконец-то зарегистрируйте свой концентратор в Unity

container.RegisterType<MyHub>(new InjectionFactory((obj) => new MyHub(obj.Resolve<ILogger>())));
0 голосов
/ 08 мая 2012

Вы не добавили SignalR.hosting.AspNet dll, поэтому создается эта ошибка. Итак, сначала включите dll с SignalR.Hosting.AspNet на сервере.

...