2011-01-25 61 views
2

我在配置WCF服務時遇到了一些困難。我的要求是它公開了一個basicHttpBinding端點以及一個netTcpBinding端點。我的一些客戶端是.NET 2.0,需要能夠通過WSDL.exe生成代理。WCF基本的HTTP和NetTCP綁定,通過Mex暴露

它似乎工作的大部分 - 但是當我試圖獲得WSDL,它不合作。在瀏覽器中,它給了我一些SOAP XML標籤,但絕對不是完整的WSDL。 WSDL.exe給了我一系列的錯誤:

錯誤:處理'http://1.2.3.4:9877/MyService/basicHttp?wsdl'時出錯。

  • 該文件被理解,但它無法處理。
  • WSDL文檔包含無法解析的鏈接。
  • 下載'http:// localhost:9877/MyService/basicHttp?wsdl = wsdl0'時出錯。
  • 底層連接已關閉:無法連接到遠程服務器。

這是我的主機配置。這裏有什麼東西會跳出來嗎?

<system.serviceModel> 
    <services> 
    <service behaviorConfiguration="MyServiceBehavior" name="MyRunner"> 
     <endpoint address="netTcp" binding="netTcpBinding" bindingConfiguration="" contract="IMyRunner"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 
     <endpoint address="basicHttp" binding="basicHttpBinding" bindingConfiguration="" contract="IMyRunner"> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" /> 
     <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" /> 
     <host> 
     <baseAddresses> 
      <add baseAddress="net.tcp://localhost:9876/MyService/netTcp" /> 
      <add baseAddress="http://localhost:9877/MyService/basicHttp" /> 
     </baseAddresses> 
     </host> 
    </service> 
    </services> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior name="MyServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 
+0

請問您的請求是否需要.svc,例如'http://1.2.3.4:9876/MyService/basicHttp.svc?wsdl' – 2011-01-25 02:06:15

+0

@Chris O:我不這麼認爲 - 服務本身工作正常罰款沒有。如果這有所作爲,我將託管在Windows服務中,而不是IIS。 – 2011-01-25 03:11:19

回答

0

感謝提示傢伙。原來問題出在baseAddress值指向「localhost」。在生成的WSDL中,它仍然會顯示「localhost」,因此WSDL.exe顯然試圖訪問本地主機(我的開發機器)而不是服務器。我將「localhost」更改爲託管該服務的服務器的實際IP,並且WSDL.exe即使在.NET 1.1中也能成功運行。而且我仍然可以通過使用svcutil.exe來獲得4.0版本。

1

如果你有兩個MEX端點,每個需要一個單獨地址 - 稱之爲一個 「MEX」,然後撥打對方 「mex2」 或東西:

<service behaviorConfiguration="MyServiceBehavior" name="MyRunner"> 
     <endpoint address="netTcp" binding="netTcpBinding" bindingConfiguration="" contract="IMyRunner"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
     </endpoint> 
     <endpoint address="basicHttp" binding="basicHttpBinding" bindingConfiguration="" contract="IMyRunner"> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" /> 
     <endpoint address="mex2" binding="mexTcpBinding" bindingConfiguration="" contract="IMetadataExchange" /> 
     <host> 
     <baseAddresses> 
      <add baseAddress="net.tcp://localhost:9876/MyService/netTcp" /> 
      <add baseAddress="http://localhost:9877/MyService/basicHttp" /> 
     </baseAddresses> 
     </host> 
    </service> 

(OK所以要根據OP的意見,他不在IIS託管,所以這是不相關的)

另外:你在IIS託管?在這種情況下,你的基址(至少是HTTP的)是沒有意義的 - SVC文件的服務器,虛擬目錄和位置將決定你的服務地址:

http://YourServer/YourVirtualDirectory/SubDirectory/YourService.svc/basicHttp 

爲你的「正常」 SERVIC端點或

http://YourServer/YourVirtualDirectory/SubDirectory/YourService.svc/mex 

用於基於HTTP的MEX端點。