2016-09-10 17 views
0

私の質問:ハブへの最初の接続をスピードアップする方法はありますか?遅いSignalR HubConnectionの開始

詳細:

私は8.1 @Win selfhosted WebサービスでSignalRを使用しています。 ハブアプリケーションにローカルクライアントとリモートクライアントが割り当てられています。

私はによってはlocalhostと127.0.0.1、DNS経由SignalRのアクセスをgranded:通常、すべてのクライアントにも地元のものはDNSを使用している

'netsh http add urlacl url=http://<Replace>:<Port>/ user=Everyone' 

。そして、それは動作します。

私の問題は、(c#Microsoft.AspNet.SignalR.Client.HubConnectionを使用して)1つの生まれた子プロセスです。それは通常400msと接続します。それで大丈夫です。しかし時には数秒かかることもあります。

私はこのクライアントを127.0.0.1とlocalhostに変更しようとしましたが、変更は一切ありません。

その後、最初の接続、SignalRはpritty fastです。

簡単な方法がない場合は、元のUDPに戻す必要があります。私は長い間、最初の接続も消えていた他の問題のバグ修正後

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; 
    } 
} 
+0

これは、既定のタイマーでIISアプリケーションプールをリサイクルする場合に該当しますか?そのため、アプリケーション全体が本質的に再起動し、すべてを再初期化する必要があり、ローカルのものであっても数秒間の遅延が発生します。通常は、リサイクルのデフォルト設定を変更して、特定の時間または特定の時間にのみリサイクルするようにしてください。デフォルトは10〜20分ごとです。 – mbrdev

+0

良い点!私はIIS Webサービス上でこの問題を数年前に見つけました。しかし、私が知る限り、セルフホストされたWebサービスにはIISやIIS Expressは必要ありません。それはリサイクルしない単なるプロセスです。 IAppBuilderのスタートアップで何らかのタイプのアイドルモードまたはスリープモードを検索しただけで、Googleビットが役に立つとは思えませんでした。私の誰かがこのトピックについてもっと知っていますか?私は自分のスタートアップメソッドを自分のクエストの詳細に追加します。 – user2029101

+0

フォールバックできますか?デフォルトでは、SiganlRは自動転送を使用しています。自動転送はWebSocketを使用して接続を試行し、失敗した場合はserverSentEventsを試し、最後にlongPollingを試します。次のトランスポートを試行するタイムアウトは(AFAIR)5秒です。また、SignalRが接続を開始するときに3つのHTTPリクエストを作成するのではなく、何らかの理由でサーバが応答が遅い場合、クライアントはすぐに起動できません。 – Pawel

答えて

0

ハブで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); 
      } 
     } 
    } 
} 

起動。

私が見つけたこと:競合状態があり、ネットワーク共有を介したFileAccessによるロックは、キャッシュされたサムネイルをローカル更新してハブをブロックすることはめったにありません。

Thxとにかく!

関連する問題