Мой вопрос: Есть ли способ ускорить начальное подключение к хабу?
Подробности:
Я использую SignalR в собственной веб-службе @Win 8.1. У приложения Hub есть локальные клиенты и удаленные клиенты.
Я увеличил доступ к SignalR через DNS, localhost и 127.0.0.1 следующим образом:
'netsh http add urlacl url=http://<Replace>:<Port>/ user=Everyone'
Обычно все клиенты, даже локальные, используют DNS. И это работает.
Моя проблема - один порожденный дочерний процесс (с использованием С# Microsoft.AspNet.SignalR.Client.HubConnection). Обычно он подключается в течение 400 мс. Все нормально. Но иногда это занимает секунды.
Я попытался переключиться на этом клиенте на 127.0.0.1 и локальный хост, но без каких-либо изменений.
После первоначального подключения SignalR работает довольно быстро.
Если нет простого способа, я должен вернуться к обычному UDP.
Конфигурация SignalR в концентраторе:
using System;
using System.Web.Http;
using Microsoft.Owin;
using Microsoft.Owin.Cors;
using Microsoft.Owin.FileSystems;
using Microsoft.Owin.StaticFiles;
using Owin;
[assembly: OwinStartup(typeof(SignalRStartUp))]
namespace Onsite
{
public class SignalRStartUp
{
// Any connection or hub wire up and configuration should go here
public void Configuration(IAppBuilder pApp)
{
try
{
pApp.UseCors(CorsOptions.AllowAll);
pApp.MapSignalR();
pApp.UseFileServer(true);
var lOptions = new StaticFileOptions
{
ContentTypeProvider = new CustomContentTypeProvider(),
FileSystem = new PhysicalFileSystem(Constants.Root)
};
pApp.UseStaticFiles(lOptions);
// Configure Web API for self-host.
var lConfig = new HttpConfiguration();
lConfig.Routes.MapHttpRoute("RemoteApi", "api/{controller}/{action}");
lConfig.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional });
pApp.UseWebApi(lConfig);
}
catch (Exception lEx)
{
Logger.Error(lEx);
}
}
}
}
Запуск на клиенте:
public static string GetConnectionString(string pHost = null)
{
var lHost = pHost ?? GetMainClientDns();
return string.Format("http://{0}{1}", lHost, SignalRPort);
}
private void StartSignalR()
{
try
{
var lConnectionString = GetConnectionString("127.0.0.1");
var lStopWatch = new Stopwatch();
lStopWatch.Restart();
IsConnectingHost = true;
_connection = new HubConnection(lConnectionString, string.Format("AccessKey={0}&Role={0}", Constants.AccessKeyPlugIn));
_connection.Reconnected += SetConnected;
_connection.Reconnecting += SetDisConnected;
MTalkHub = _connection.CreateHubProxy("OnsiteHub");
MTalkHub.On("RequestSetNext", RequestSetNext);
MTalkHub.On("RequestSetPrevious", RequestSetPrevious);
MTalkHub.On("RequestEcho", RequestEcho);
_connection.TransportConnectTimeout = _transportConnectTimeout;
var lTask = _connection.Start();
lTask.Wait();
lStopWatch.Stop();
SetConnected();
}
catch (TargetInvocationException lEx)
{
IsDisconnected = true;
Task.Run(() => TryToConnect());
Logger.Fatal(string.Format("Server failed to start. Already running on: '{0}'", lConnectionString), lEx);
}
catch (Exception lEx)
{
IsDisconnected = true;
Task.Run(() => TryToConnect());
Logger.Fatal(string.Format("Connecting to: '{0}' failed!", lConnectionString.ToStringNs()));
}
finally
{
IsConnectingHost = false;
}
}