2017-04-21 3 views
2

우리는 독립형 SignalR 서버를 사용하고 우리가 사용하고있는 몇 개의 허브를 구축하려고합니다. 그들은 올바르게 작동하지만 SignalR이 WebSockets 전송을 이용할 수 없었습니다.SignalNET은 ASPNET과 함께 Websocket Transport를 사용하지 않습니다. 4.6

일반적으로 WebSockets을 사용하여 SignalR을 협상하기위한 요구 사항에 대한 최신 정보를 찾는 데 어려움이 있습니다. 누군가 WebSocket이 사용되지 않는 이유를 알아낼 수 있습니까?

우리의 구성에 대한 조금 :

  • SignalR 서버 :
    • "Microsoft.AspNet.SignalR": "2.2.1"
    • 프레임 워크 : net462
  • 호스팅 :
    • Azure App Se rvices
      • 웹 소켓 :
      • CORS에 : 허용 기원 : *
      • 가격 계층 : 기본 : 1 작은
      • .NET 프레임 워크 버전 V4.6
      • SSL 인증서

Google은 최신 버전의 Chrome을 사용하고 있습니다. 및 Edge를 JS 클라이언트로 사용합니다.

은 https : //customdomain/signalr/negotiate?clientProtocol=1.5

Startup.cs

app.UseOwinAppBuilder(map => 
{ 
    map.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 
    HubConfiguration hubConfiguration = new HubConfiguration 
    { 
     EnableDetailedErrors = hubConfig.EnableDetailedErrors.Value, 
    }; 
    map.MapSignalR("/signalr", hubConfiguration); 
}); 


public static IApplicationBuilder UseOwinAppBuilder(this IApplicationBuilder app, Action<IAppBuilder> configuration) 
{ 
    if (app == null) 
    { 
     throw new ArgumentNullException(nameof(app)); 
    } 

    if (configuration == null) 
    { 
     throw new ArgumentNullException(nameof(configuration)); 
    } 

    return app.UseOwin(setup => setup(next => 
    { 
     AppBuilder builder = new AppBuilder(); 
     IApplicationLifetime lifetime = (IApplicationLifetime)app.ApplicationServices.GetService(typeof(IApplicationLifetime)); 
     IServiceProvider serviceProvider = (IServiceProvider)app.ApplicationServices.GetService(typeof(IServiceProvider)); 
     IHostingEnvironment hostingEnv = (IHostingEnvironment)app.ApplicationServices.GetService(typeof(IHostingEnvironment)); 

     AppProperties properties = new AppProperties(builder.Properties); 
     properties.AppName = hostingEnv.ApplicationName; 
     properties.OnAppDisposing = lifetime.ApplicationStopping; 
     properties.DefaultApp = next; 

     configuration(builder); 

     return builder.Build<Func<IDictionary<string, object>, Task>>(); 
    })); 
} 

SignalR 서버에서 응답을 협상 : 여기

우리 SignalR 서버 구성의 일부입니다 & connectionData = [{ "name": "hubname"}]

{ 
    "Url": "/signalr", 
    "ConnectionToken": "MTY5ODlmZmItMDUxNC00ZmJhLTgzZjMtOTcyOGM5ZTUxY2IwOg==", 
    "ConnectionId": "16989ffb-0514-4fba-83f3-9728c9e51cb0", 
    "KeepAliveTimeout": 20, 
    "DisconnectTimeout": 30, 
    "ConnectionTimeout": 110, 
    "TryWebSockets": false, 
    "ProtocolVersion": "1.5", 
    "TransportConnectTimeout": 5, 
    "LongPollDelay": 0 
} 

JS 클라이언트 초기화 :

$.connection.hub.logging = true; 
$.connection.hub.start({ 
    transport: ['webSockets', 'longPolling'], 
    withCredentials: false 
}); 

전체 웹.설정 :

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.web> 
     <httpRuntime targetFramework="4.6"/> 
     <compilation targetFramework="4.6" strict="true">   
     </compilation> 
    </system.web> 
    <system.webServer> 
     <handlers> 
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/> 
     </handlers> 
     <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/> 
    </system.webServer> 
</configuration> 

크롬 도구 콘솔 메시지 :

[19:05:22 GMT-0400 (Eastern Daylight Time)] SignalR: Fired ajax abort async = false. 
[19:05:22 GMT-0400 (Eastern Daylight Time)] SignalR: Auto detected cross domain url. 
[19:05:22 GMT-0400 (Eastern Daylight Time)] SignalR: Client subscribed to hub 'concurrentaccesshub'. 
[19:05:22 GMT-0400 (Eastern Daylight Time)] SignalR: Negotiating with 'https: //customdomain/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22concurrentaccesshub%22%7D%5D'. 
[19:05:22 GMT-0400 (Eastern Daylight Time)] SignalR: longPolling transport starting. 
[19:05:23 GMT-0400 (Eastern Daylight Time)] SignalR: Opening long polling request to 'https: //customdomain/signalr/connect?transport=longP…Og%3D%3D&connectionData=%5B%7B%22name%22%3A%22concurrentaccesshub%22%7D%5D'. 
[19:05:23 GMT-0400 (Eastern Daylight Time)] SignalR: Long poll complete. 
[19:05:23 GMT-0400 (Eastern Daylight Time)] SignalR: LongPolling connected. 
[19:05:23 GMT-0400 (Eastern Daylight Time)] SignalR: longPolling transport connected. Initiating start request. 

편집 제안 당, 내가 명시 적으로 만 WebSocket을 수송 할 수송을 설정 2017년 4월 26일

:

$.connection.hub.logging = true; 
$.connection.hub.start({ 
    transport: ['webSockets'], 
    withCredentials: false 
}); 

여기에서 a 오류 메시지 :

SignalR: Auto detected cross domain url. 
SignalR: Client subscribed to hub 'concurrentaccesshub'. 
SignalR: Negotiating with 'http: //localhost:56637/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22concurrentaccesshub%22%7D%5D'. 
SignalR: No transports supported by the server were selected. 
SignalR: Stopping connection. 

답변

0

설명에 따라 내 문제를 재현 할 수 없습니다. Azure Web App에서 ASPNET 4.6과 함께 Websocket Transport를 사용할 수 있습니다.

"TryWebSockets"거짓

이 응답은 웹 소켓이 서버 측에서 비활성화 된 것을 의미한다. webSocket에서도 webSocket을 비활성화 할 수 있습니다. 웹 구성 파일에 다음 섹션이 있는지 확인하십시오.

<system.webServer> 
    <webSocket enabled="false"/> 
</system.webServer> 

는 OWIN을 사용하고 있기 때문에, 당신은 웹 양말을 사용하는 Startup.Configure 방법에 다음 코드를 추가 여부를 확인하시기 바랍니다

2017년 5월 2일 업데이트되었습니다.

public void Configure(IApplicationBuilder app) 
{ 
    app.UseWebSockets(); 
    app.UseSignalR(); 
} 
+0

web.config에는''가 없지만이를 명시 적으로 true로 설정하려고합니다. 나는 또한 내 첫 번째 질문을 내 full web.config를 수정하려고합니다. –

+0

IIS Express (Windows 10 호스트)를 사용하여 로컬에서 실행 중이며, '또는 '나는 행동 변화가 있는지 확인합니다. 실제로 WebSocketModule b/c에서 500.19 오류가 발생합니다.이 오류는 이미 applicationHost.config에서 true로 정의되어 있습니다. 또한 전체 web.config 파일로 내 게시물을 업데이트했습니다. –

+0

JS 코드에서 transport의 값을 [ 'webSockets']로 명시 적으로 변경하여 webSocket을 사용하십시오. 오류가 발생했는지 확인하고 세부 오류 메시지를 제공하십시오. – Amor