2017-04-27 1 views
1

ASP.NET 응용 프로그램이 있습니다. 디버깅으로 실행합니다. localhost : 2842에서 실행됩니다.ASP.NET SignalR 시작시 C# 클라이언트 응용 프로그램 예외

서버에 메소드가없는 클래스에 정의 된 SignalR Hub가 있습니다.

WPF Windows C# 응용 프로그램이 있습니다. 나는 SignalR NuGet 패키지를 추가했다.

public partial class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     ConfigureAuth(app); 

     app.MapSignalR(new HubConfiguration 
     { 
      EnableDetailedErrors = true 
     }); 
    } 
} 
:

public class MyHub : Hub 
{ 
    public static void SendMeData(string dataString) 
    { 
     var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
     if (context != null) 
      context.Clients.All.SendMeData(dataString); 
    } 
} 

내가 Startup.cs이 코드를 가지고 :

여기
 var hubConnection = new HubConnection("http://localhost:2842"); 

     IHubProxy myHubProxy = hubConnection.CreateHubProxy("MyHub"); 
     myHubProxy.On<string>("SendMeData", dataString => { 

      Console.WriteLine("String value {0}", dataString); 
     }); 

     hubConnection.Start().Wait(); 

가 내 허브 클래스는 서버에 정의되어있다 : 나는 클라이언트 프록시를 인스턴스화하려면 다음 코드를 사용

내가 겪고있는 문제는 C# 클라이언트가 hubConnection.Start()를 호출 할 때입니다. 나는 아주 도움이되는 예외를 얻는다. 다음은 예외입니다.

StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content: 
System.Net.Http.StreamContent, Headers: Transfer-Encoding: chunked 
X-SourceFiles: =?UTF-8?B?QzpcTXlEZXZcUmVhbHRpbWVNRFxSZWFsdGltZU1EUHJvdG9cUmVhbHRpbWVNRFByb3RvXHNpZ25hbHJcbmVnb3RpYXRl?= 
Cache-Control: private Date: Thu, 27 Apr 2017 04:23:18 GMT Server: Microsoft-IIS/10.0 
X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Content-Type: text/html; charset=utf-8 

서버 코드에 중단 점을 설정했는데 절대로 그 중 하나에 도달하지 않습니다.

어떻게 알아낼 수 있습니까?

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
     if (context != null) 

이 제거하십시오 : 당신의 MyHub 클래스에서

+0

개발자 예외를 설정하여 스택 추적을 보거나 첫 번째 예외의 중단을 설정하고 서버를 디버깅합니다. – Pawel

답변

0

전체 문제는 내가 CreateHubProxy에 사용되는 이름을 변경하지 않고 서버 내 허브 클래스의 이름을 변경했다고 었죠해야한다. 지금 일하고있다.

0

, 당신은 다음 줄을 가지고있다. 대신 당신의 MyHub 클래스는해야한다 :

public class MyHub : Hub 
{ 
    public static void SendMeData(string dataString) 
    { 
     Clients.All.SendMeData(dataString); 
    } 
} 

GetHubContext는 동일한 응용 프로그램 도메인 내에서 다른 클래스에서 허브에 대한 참조를 얻기 위해 사용된다. 예를 들어 컨트롤러 클래스에 있고 동일한 AppDomain 내의 허브에서 메서드를 호출해야하는 경우 GetHubContext를 통해 허브에 대한 참조를 가져옵니다.

또한 클라이언트 코드에서 .Wait()를 제거하십시오. 코드는

await hubConnection.Start(); 

Reference

+0

클라이언트가 정적이 아닙니다. 객체 포인터가없는 클라이언트에 대한 액세스 권한을 얻으려면 어떻게해야합니까? SendMeData를 사용하여 회의 컨트롤러 내부에서 클라이언트로 데이터를 보낼 수 있어야합니다. – user856232

+0

클라이언트는 허브의 동적 속성입니다. Intellisense 지원을받을 수 없지만 코드가 컴파일됩니다. 여기에있는 SignalR 소스 코드의 속성으로 볼 수 있습니다. https://github.com/SignalR/SignalR/blob/2.2.0/src/Microsoft.AspNet.SignalR.Core/Hub.cs –

+0

코드가 변경되었습니다. CS0120 : 비 정적 필드, 메서드 또는 'Hub.Clients'속성에 대한 객체 참조가 필요합니다. – user856232