2010-02-03 399 views
16

我發現我可以將我打算使用的SOAP/WSDL服務導入到我的解決方案中,作爲「Web服務參考」( System.Web.Services)或「服務參考」(System.ServiceModel/WCF)。Visual Studio/SOAP - '添加服務參考'與'添加Web服務參考'

我想知道是否有什麼區別。我知道'添加服務引用'/ WCF是更新的,是否有使用它通過System.Web.Services有什麼缺點,或者它現在是在.Net中使用SOAP服務的首選方式?

回答

21

首選和最有用的方法確實是使用Add Service Reference。這會將您的服務添加爲WCF客戶端代理。

Add Web Reference是「老式」ASMX/ASP.NET webservice的做事方式。

WCF比ASMX了更好的選擇,因爲:

  • 它的更新,將在未來得到支持(ASMX是在路上出);如果你現在瞭解它,你就無需再學習它的時候ASMX肯定了
  • 它在各個方面提供了更大的靈活性
  • 你永遠只能舉辦一個ASMX服務是IIS,使用HTTP作爲協議; WCF可以在IIS中託管;自託管在Windows NT服務中; WCF可以使用HTTP,NetTCP,MSMQ和多協議
  • WCF提供了更多的安全和其他設置,使得它更強大的使用

是,WCF擁有大約是一個壞名聲真的很難學習 - 我真的不覺得這是真的。檢查那些初學者的資源 - 確實非常有用!

+0

感謝您的鏈接馬克!一直在尋找更多的信息。 :) – 2010-02-03 17:17:43

+0

這3個複數連接似乎被打破... – fretje 2011-02-17 13:14:48

+0

@fretje:是的,對不起 - 他們決定讓自己的網站上的截屏視頻只提供給訂閱者.....我會盡力找到那些WCF開發人員中心和更新鏈接....掛上..... – 2011-02-17 16:23:07

3

我認爲其中一個區別在於服務的自動生成代理代碼。如果使用服務引用,則應用程序將需要WCF層進行通信。這通常不是問題,但是如果您正在編寫將在其他平臺(如Mono)上運行的代碼,則您將希望使用Web服務引用(因爲Mono目前不支持WCF)。

6

我有一個的呼喚形式,它在J2EE和在WebSphere託管現有的SOAP服務的應用。

我創建了兩個控制檯應用程序 - 一個將該服務作爲舊學校Web服務引用,另一個將其引用爲服務引用。

在這兩種情況下,Visual Studio都會爲該服務創建代理類和適當的配置條目。

在Service Reference控制檯應用程序中,我得到了許多配置選項,這些配置選項在Web Service應用程序中看不到。特別是,我可以設置最大郵件大小等。

事實上,爲了讓Service Reference控制檯應用程序正常工作,我不得不增加默認郵件大小以獲取所有發送的數據在其中一個方法調用中。

這裏的配置應該是什麼樣的服務參考應用:

<configuration> 
    <system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="ClaimSoapBinding" closeTimeout="00:01:00" openTimeout="00:01:00" 
        receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" 
        bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
        maxBufferSize="65536000" maxBufferPoolSize="524288" maxReceivedMessageSize="65536000" 
        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
        useDefaultWebProxy="true"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <security mode="None"> 
         <transport clientCredentialType="None" proxyCredentialType="None" 
          realm="" /> 
         <message clientCredentialType="UserName" algorithmSuite="Default" /> 
        </security> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://urlgoeshere/ClaimService" 
       binding="basicHttpBinding" bindingConfiguration="ClaimSoapBinding" 
       contract="ClaimService.Claim" name="ClaimService" /> 
     </client> 
    </system.serviceModel> 
</configuration> 

在我的老同學Web服務控制檯應用程序,我沒有在所有修改配置找回巨頭一套數據發回。以下是它的配置:

<configuration> 
    <configSections> 
     <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
      <section name="ServiceTesterOldSchool.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
     </sectionGroup> 
    </configSections> 
    <applicationSettings> 
     <ServiceTesterOldSchool.Properties.Settings> 
      <setting name="ServiceTesterOldSchool_ClaimService_ClaimService" 
       serializeAs="String"> 
       <value>http://urlgoeshere/ClaimService</value> 
      </setting> 
     </ServiceTesterOldSchool.Properties.Settings> 
    </applicationSettings> 
</configuration> 

這很簡單,但缺少很多我們通過服務引用獲得的選項。

在這兩種情況下調用服務的實際代碼幾乎相同。

不過,爲了回答你的問題,我認爲堅持目前的做法很重要。 Microsoft甚至可以在添加舊學校Web參考(至少在VS2008中)之前,通過強制您經歷兩級對話來澄清這一點。

我認爲WCF的方式更加靈活,配置對於發生的事情有更多的描述。另外,當您將新的WCF組件添加到您的應用程序中時,保持您的配置設置保持一致,而不是在舊學校和WCF之間進行混合和匹配,將會很不錯。