昨天在用IIS部署一個WCF服務時,碰到了如下錯誤:
理解了文檔內容,但無法進行處理。
- WSDL 文檔包含無法解析的連結。
- 下載“http://admin-pc/IISHostService/Service1.svc?xsd=xsd0”時出錯。
- 基礎串連已經關閉: 接收時發生錯誤。
- 無法從傳輸串連中讀取資料: 遠程主機強迫關閉了一個現有的串連。。
- 遠程主機強迫關閉了一個現有的串連。
中繼資料套件含無法解析的引用:“http://admin-pc/IISHostService/Service1.svc?wsdl”。
中繼資料套件含無法解析的引用:“http://admin-pc/IISHostService/Service1.svc?wsdl”。
如果該服務已在當前解決方案中定義,請嘗試產生該解決方案,然後再次加入服務參考。
該錯誤是在使用svcutil產生client代碼時報的錯誤,服務是部署在IIS7上,部署的過程都是完全教科書式的進行。服務也正常啟動了,顯示如下內容
已建立服務。
若要測試此服務,需要建立一個用戶端,並將其用於調用該服務。可以使用下列文法,從命令列中使用 svcutil.exe 工具來進行此操作:
svcutil.exe http://leo-pc/IISHostService/Service1.svc?wsdl
按照提示直接用svcutil.exe http://admin-pc/IISHostService/Service1.svc?wsdl命令去產生代碼,就出現了開頭說的那個錯誤。而如果用visual studio的webdevserver啟動,則一切正常。
經過一輪穀百之後,發現網上有很多類似的情況,有的說是因為用了wsHttpBinding協議引起的,或者是中繼資料沒有正確公開,但都不是他們說的情況。後來找到了一篇文章,說的是添加WCF引用的一個陷阱。裡面提到的情形跟我遇到的一致,原來問題出在許可權,難怪用webdevserver可以很正常的運行。原來在下載http://admin-pc/IISHostService/Service1.svc?xsd=xsd0時的許可權不足,在瀏覽器直接存取這個url會提示找不到頁面。原因就是IIS進程的使用者沒有訪問Windows\Temp目錄的許可權。找到Temp目錄,然後找到IIS_USER使用者,授權即可。
具體可參考:http://merill.net/2008/04/wcf-add-service-reference-gotcha-with-windows-server/