콘솔 응용 프로그램에이 코드가 있습니다. 개발 도구 크롬에서 연결을 시도하고 있지만 WCF 측에서 문제가 확실하지만이 오류가 발생합니다.
WebSocket connection to 'wss://127.0.0.1:5650/Echo' failed: Error in connection establishment: net::ERR_CONNECTION_RESET
WSS 가 내 서버 코드를 치지 않고 예외도 로그도 없습니다. 최소한의 수정으로 WS가 제대로 작동합니다. 코드를 단순화하기 위해 nuget 의 Microsoft.WebSockets 를 사용했습니다 .
WebSocketHost server = new WebSocketHost(typeof(EchoWSService), new Uri("https://127.0.0.1:5650/Echo"));
var bindingSsl = WebSocketHost.CreateWebSocketBinding(true);
server.AddWebSocketEndpoint(bindingSsl);
server.Open();
나는 이미 Custom Cert Validator를 시도했지만 내 코드에 맞지 않는다고 말했습니다.
이제 ServiceRoute를 사용하는 ASP.net 앱에서 server.Open () 을 제외하고 동일한 코드가 있으며 꽤 잘 작동합니다! 예, SSL 및 IIS Express 용 VS에서 생성 한 자체 서명 된 인증서 :
RouteTable.Routes.Add(new ServiceRoute("Echo", new TRWebSocketServiceFactory(), typeof(EchoWSService)));
브라우저 측은 다음과 같습니다.
var ws = new WebSocket('wss://127.0.0.1:5650/Echo')
에서 의 Web.config 나는 이상이없는
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
그렇다면 도대체 왜 간단한 콘솔 앱에서 자체 호스팅 WCF가 작동하지 않습니까?
좋아, 마침내 나는 자기 서명 된 인증서와 COMODO에서 발행 한 인증서로이 작업을했다. IIS가 수행하는 작업을 조사하고 모방하여 OS 수준에서 포트와 호스트를 바인딩합니다. 이 결과를이 코드 프로젝트 게시물 에 기반으로했습니다 .
1. 호스팅 머신에 인증서를 설치합니다. 제안 테스트를 위해 IIS 용 VS로 생성 된 자체 서명 된 인증서를 사용하고 있습니다. 다른 것을 사용하거나 makecert.exe로 직접 만들 수 있습니다. Personal → Certificates 에 설치합니다 .
2. 소켓을 고정합니다. 관리자 권한으로 명령 줄을 통해 다음을 실행합니다.
netsh http add sslcert ipport=0.0.0.0:5650 certhash=xxxxxxx.. appid={xxxx-xxx..} certstorename=MY
netsh http add sslcert hostnameport=domainnamne:5650 certhash=xxxxxxx.. appid={xxxx-xxx..} certstorename=MY
어디:
Windows Server 2008에서는 동일한 제안에 * httpcfg.exe ***를 사용할 수 있습니다. 성공적으로 바인딩되면 다음을 실행하여 검토 할 수 있습니다.
netsh http show sslcert
우리는 얻을 것이다:
Hostname:port : domainname:5650
Certificate Hash : xxxxxxx..
Application ID : {xxxx-xxx..}
Certificate Store Name : MY
Verify Client Certificate Revocation : Enabled
…
3. 브라우저 측에서 인증서를 수락합니다. 신뢰할 수있는 유효한 인증서가있는 경우에는 이 단계가 필요하지 않습니다 .
따라서 브라우저가 인증서를 수락하도록하려면 https : // domainname : 5650으로 이동합니다 (도메인 이름은 2 단계에서 바인딩하는 데 사용한 것과 일치해야 함). 그런 다음 인증서를 수락하라는 대화 상자가 표시됩니다. https : // domainname : 5650 / Service .
그리고 Voila, 콘솔에서 다음을 시도 할 수 있습니다.
ws = new WebSocket('wss://domainname:5650/Service');
그리고 예외는 없습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다