2015-08-24 72 views
2

我在控制檯應用程序中有此代碼。 我試圖從開發工具鉻連接,但得到這個錯誤,雖然這個問題是肯定的WCF的一面:使用WebSockets自行託管的WCF不能使用SSL

WebSocket connection to 'wss://127.0.0.1:5650/Echo' failed: Error in connection establishment: net::ERR_CONNECTION_RESET 

WSS不打我的服務器代碼,沒有例外甚至沒有日誌。最小修改的WS工作正常。我用Microsoft.WebSockets從的NuGet來簡化代碼:

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(); 

我已經嘗試過自定義證書驗證,但正如我所說這是不是打我的代碼。

現在我除了server.Open()相同的代碼使用ServiceRoute一個ASP.net應用程序,它工作相當好!是使用SSL和VS的IIS生成的自簽名的證書表示:

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在一個簡單的控制檯應用程序?

+0

您是否在配置中啓用了跟蹤功能?如果不添加,你可能會得到一些關於它失敗原因的更多細節。 –

+0

自簽名證書? – vtortola

+0

@JamieBabineau yep我啓用了日誌,但我沒有得到任何東西,當我嘗試進行連接時<= source name =「System.ServiceModel」switchValue =「All,ActivityTracing」propagateActivity =「true」> –

回答

2

好的,最後我得到了這個自簽名證書和COMODO頒發的證書。 我調查了IIS的功能,並模仿它,它在操作系統級別綁定端口和主機。我基於這個結果在這codeproject post

1.在主機中安裝證書。 對於測試提議,我正在使用VS for IIS生成的自簽名證書。您可以使用另一個或使用makecert.exe自己創建它。安裝在個人→證書enter image description here

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 

其中:

  • ipport和hostnameport =是IP,主機或域名和端口綁定到該證書。
  • certhash =是證書的拇指打印沒有空格。
  • appid =是無論什麼GUID,它應該確定哪些應用程序正在使用它。
  • certstorename =到證書的路徑,在這種情況下,我的手段個人→證書

在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

enter image description here

,瞧,在控制檯中,您可以嘗試:

ws = new WebSocket('wss://domainname:5650/Service'); 

而且沒有例外。

enter image description here