Vista下調式WCF的http服務的安全問題 今天在Vista下開發了一個WCF的Tcp程式,跑的很正常, 突然想公開一下Http介面,按WCF的文檔說明,應該沒有問題的,但是非常令人氣氛的說 服務進程沒有許可權開啟連接埠,具體錯誤資訊類似: System.ServiceModel.AddressAccessDeniedException:HTTP 無法註冊 URL http://+:8000/ServiceModelSamples/service/。進程不具有此命名空間的存取權限(有關詳細資料,請參見 http://go.microsoft.com/fwlink/?LinkId=70353)。---> System.Net.HttpListenerException:訪問被拒絕 msdn上提了三個步驟來解決這個問題: 1.如果電腦不是域成員,請將身分識別驗證模式和保護層級設定為 None 以禁用傳輸安全性,如下面的樣本配置所示: 確保通過設定終結點的 bindingConfiguration 屬性將終結點與綁定關聯。 確保在運行樣本前更改 PoisonMessageServer、伺服器和用戶端上的配置。 2.注意: 將 security mode 設定為 None 等效於將 MsmqAuthenticationMode、MsmqProtectionLevel 和 Message 安全設定為 None。 3.若要使中繼資料交換正常工作,應當向 http 綁定註冊一個 URL。這要求服務在具有提升許可權的命令視窗中運行。否則,您將接收到異常 最後我以管理員權限來開啟這個程式才能註冊URL,看來Vista的安全性確實比較高,不知道該怎麼寫這個程式才能在vista下順利運行 另外,我測試了一下tcp協議和basicHttp協議的效能差異: 兩者居然差別不是特別大: 服務和用戶端程式都在一個伺服器上(vista) 以tcp方式調用500次,大概使用600毫秒 以http方式調用500次,大概使用800毫秒 整體來說http比tcp慢30%不到,還是能夠接受 當然這是在本機,如果是在公網上跑,就沒有這麼樂觀了。居然沒筆調用才1毫秒多一點。神速啊! 附我完整測試的服務配置,供大家參考: <system.serviceModel> <services> <service name="ServerPart.Server" behaviorConfiguration="sb"> <host> <baseAddresses> <add baseAddress="net.tcp://127.0.0.1:5353" /> <add baseAddress="http://127.0.0.1:5356/" /> </baseAddresses> </host> <endpoint address="net" binding="netTcpBinding" bindingConfiguration="bd" contract="ServerPart.IServer" /> <endpoint address="httpend" binding="basicHttpBinding" contract="ServerPart.IServer" bindingConfiguration="httpbd" /> <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" /> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <bindings> <netTcpBinding> <binding name="bd"> </binding> </netTcpBinding> <basicHttpBinding> <binding name="httpbd"> <security mode="None" /> </binding> </basicHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="sb"> <serviceMetadata /> <!--<serviceMetadata httpGetEnabled="true" />--> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> |