簡體   English   中英

將WCF服務作為.NET 2.0目標客戶端的Web服務公開時,真的需要basicHttpBinding嗎?

[英]Is basicHttpBinding really required when exposing a WCF service as a Web Service for .NET 2.0 Target Client?

我有WCF服務,並將其托管在Windows服務中。

我試圖從基於.NET 2.0的Windows Form客戶端添加對該服務的引用。 我可以通過指向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

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

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

如果查看合同,您會發現mexHttpBinding的合同甚至不是"HBAcsNX.HBAccess" ,而是"IMetadataExchange".

您的配置不太一致.....

<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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM