2009-06-26 65 views
0

我有一個WCF服務,並將其託管在Windows服務中。將WCF服務公開爲.NET 2.0目標客戶端的Web服務時,真的需要basicHttpBinding嗎?

我試圖從建立在.NET 2.0上的Windows窗體客戶端添加對該服務的引用。我可以通過指向httpGetUrl =「http:// localhost:8002/HBAccess/help/mex」來獲取Web引用,但是當我檢查Reference.cs時---它只包含一個沒有任何內容的命名空間。

現在我添加了basicHttpBinding的和重複相同的步驟:

現在我可以看到Web服務的類。

我的高級同事堅持認爲將httpGetEnabled設置爲true將足以通過http導出WCF服務並創建適當的Web引用。

任何人都可以指向我在這裏失蹤的東西嗎?

<system.serviceModel> 
<services> 
    <service behaviorConfiguration="HBAcsNX.HBAccessBehavior" name="HBAcsNX.HBAccess"> 
     <!--<endpoint address="" binding="basicHttpBinding" contract="HBAcsNX.HBAccess" />--> 
     <endpoint address="HBAccess" binding="netTcpBinding" contract="HBAcsNX.HBAccess" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
       <add baseAddress="net.tcp://localhost:18264/HBAccess/" /> 
       <add baseAddress="http://localhost:8002/HBAccess/" /> 
      </baseAddresses> 
     </host> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
     <behavior name="HBAcsNX.HBAccessBehavior"> 
      <serviceDebug includeExceptionDetailInFaults="True" httpHelpPageUrl="http://localhost:8002/HBAccess/help" /> 
      <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8002/HBAccess/help/mex" /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 
</system.serviceModel> 

//得到的Reference.cs(空代理存根,只有命名空間)

#pragma warning disable 1591 
namespace Form.ServiceClient { 
} 
#pragma warning restore 1591 

回答

2

問題mexHttpBinding實際上不是暴露你的服務,它只是暴露你的服務的defenition,由於.NET 2.0不明白nettcp你得到一個空的命名空間,你需要因爲你的服務端點是basicHttpBinding。

,如果你看一下合同,你看到,mexHttpBinding合同甚至沒有"HBAcsNX.HBAccess"而是"IMetadataExchange".

2

您必須指定一個綁定,basicHttpBinding的是,與.NET 2.0的客戶端進行互操作的唯一一個。 .NET 2.0 ASMX客戶端僅支持基於HTTP的XML,並且不支持WS- *協議。

1

你的配置並不完全排隊.....

<service name="HBAcsNX.HBAccess" 
     behaviorConfiguration="HBAcsNX.HBAccessBehavior" > 
    <host> 
     <baseAddresses> 
      <add baseAddress="http://localhost:8002/HBAccess/" /> 
     </baseAddresses> 
    </host> 

    <endpoint address="mex" 
      binding="mexHttpBinding" contract="IMetadataExchange" /> 
</service> 

如果你把一切都考慮在內,從基址得到http://localhost:8002/HBAccess/,加上mex從MEX終結 - >http://localhost:8002/HBAccess/mex

但你的行爲的配置,您使用不同的地址MEX:

<behavior name="HBAcsNX.HBAccessBehavior"> 
    <serviceMetadata httpGetEnabled="true" 
        httpGetUrl="http://localhost:8002/HBAccess/help/mex" /> 
</behavior> 

在這裏,你指向http://localhost:8002/HBAccess/help/mex - 請注意額外的/help。現在哪一個是真的?

我會建議在服務行爲的配置折騰掉了明確的httpGetUrl - 只需使用:

<behavior name="HBAcsNX.HBAccessBehavior"> 
    <serviceMetadata httpGetEnabled="true" /> 
</behavior> 

,你應該能夠在http://localhost:8002/HBAccess/mex得到您的MEX。

馬克

+0

我只是想你建議和網絡服務仍然無法在HTTP上找到://本地主機:8002/HBAccess/mex URI – Nap 2009-07-01 11:03:50