2010-01-23 95 views
12

我正在開發的當前項目正在廣泛使用Web服務,並且是在.net 3.5中製作的。現在,當我們要實施第二階段時,如果我們應該像以前一樣使用WCF或Web服務,我們會感到困惑。此外,還有什麼新的東西可以用到,並且正在提供關於Web服務或WCF的.net 4.0。可以選擇什麼? ASMX Web服務或WCF在.net 3.5中?

回答

26

我們剛剛完成了一個全新的項目,首次使用WCF而不是ASMX Web Services。我們對結果非常滿意,但是確實知道學習曲線陡峭。即便如此,我們對整體結果感到非常滿意,並且知道這是微軟今後所做工作的基礎,而且這一切都是值得的。

快速好處我們獲得了OVER ASMX

1)對於內部(在防火牆後面)的服務,以服務我們使用的網內通話:TCP結合,這比SOAP要快得多

2 )我們在同一服務上啓用了net:tcp端點和「web」端點,僅配置文件更新(無代碼更改)

3)我們能夠創建僅支持AJAX的RESTful Web服務更改並使用已內置的DataContractJsonSerializer o否則,我們不得不編寫一個HTTP Handler(ashx)並手動處理大部分Json序列化和url解析。 4)由於我們的網站需要進行性能優化和穩定性擴展,因此我們正在考慮轉換爲使用基於MSMQ的消息傳遞結構,該消息傳遞結構是異步和保證的並且參與事務; WCF提供了一個MSMQ bindng,它在我們的服務中只需要很少或者沒有代碼更改 - 只需引用更新並使用現有服務正確設置MSMQ(以及爲事務邊界添加屬性)即可。

但是警告:真的投資學習這個(買藍色的O-Reily書並通過它)。在開發過程中有些參數名稱更改實際上不會中斷服務引用,但會導致傳遞null參數(內置版本傾斜處理),託管要考慮的模型(Windows服務與IIS)以及實例化模型和FaultExceptions都可以真正理解。我們沒有進入,我們有一些痛苦。但是,我們前進了一步,對我們的學習以及我們沒有與ASMX綁定的靈活性和增長機會感到非常高興!

+1

託尼是更新值得努力......我的意思是你看到相當的性能,功能和靈活性增強時,從ASMX切換到WCF? – HotTester 2010-01-23 05:26:50

+1

+1好點託尼 – Perpetualcoder 2010-01-23 05:56:03

+0

有關性能的更多信息,請訪問:http://msdn.microsoft.com/en-us/library/bb310550.aspx – magnus 2010-01-23 15:10:26

3

有跳躍到WCF之前不同點考慮:

  1. WCF是建築更加堅固,並促進最佳實踐。
  2. 如果你知道你在做什麼「絲般光滑」,如果不是你在一個 騎。
  3. 您是否有足夠的時間完成服務轉換?

最後我會說,如果你有時間,金光閃閃和肌肉做升級。這很值得。如果asmx滿足所有需求,則可以堅持使用Web服務。

3

另外兩個方面:

  1. 無論你如何決定這對於服務器端,您可以輕鬆地使用Web服務,只使用WCF服務WCF的客戶端。如果您使用單個客戶端使用多個服務,這是有價值的。

  2. 你問了即將到來的主題。如果您考慮雲計算:可以在Windows Azure上託管WCF服務。

11

ASMX是偉大的,簡單的 - 但它在許多方面很有限:

  • 你只能承載您的Web服務在IIS
  • 你只能通過HTTP
  • 達到您的Web服務
  • 安全是非常有限的

WCF補救措施 - 並提供更多的東西。您可以根據需要將您的WCF服務託管在IIS中,或者在控制檯應用程序或Win NT Service中託管自己的WCF服務。您可以使用HTTP,TCP/IP,MSMQ,對等協議,用於在線通信的命名管道等連接WCF服務。

我會絕對推薦你去用WCF。這比ASMX複雜一點,但它也提供了更多的功能和選擇!

至於資源:有MSDN WCF Developer Center,其中有從初學者的教程,文章和示例代碼的一切。

另外,我建議你看看Pluralsight screen casts on WCF - 這是一個優秀的系列從「Creating your first WCF service」和「Creating your first WCF client」走出一路相當高級的主題。亞倫Skonnard很好地解釋了10-15分鐘屏幕錄像中的所有內容 - 強烈推薦!

3

無論使用WCF還是ASMX,請確保使用asp:ScriptManager標記將您的服務添加到您的頁面。它將爲您構建JavaScript代理,其優點是您無需構建任何解析,無論底層協議如何。這非常非常好。這個例子是ASMX,但是它和使用WCF一樣乾淨。

<asp:ScriptManager ID="ScriptManager1" runat="server"> 
    <Services> 
     <asp:ServiceReference Path="~/WebServices/Admin/HospitalLocationService.asmx" InlineScript="true" /> 
    </Services> 
</asp:ScriptManager> 

另外,還可以使ASMX通過添加ScriptService和ScriptMethod發送JSON屬性:

<System.Web.Services.WebService(Namespace:="http://www.fujimed.com/")> _ 
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ 
<ToolboxItem(False)> _ 
<ScriptService()> _ 
Public Class HospitalLocationService 
    Inherits System.Web.Services.WebService 

    <WebMethod()> _ 
    <ScriptMethod()> _ 
    Public Function GetAll() As List(Of HospitalLocationEntity) 
     Return (New HospitalLocation()).GetAll().Data 
    End Function 

    <WebMethod()> _ 
    <ScriptMethod()> _ 
    Public Function GetByID(ByVal ID As Integer) As HospitalLocationEntity 
     Return (New HospitalLocation()).GetHospitalLocation(ID).Data 
    End Function 

End Class 

消費服務,而無需解析(這是使用ScriptManager爲你做):

function editLocation(id) { 
    vRIS.HospitalLocationService.GetByID(id, getComplete, getError); 
} 

function getComplete(results, context, methodName) { 
    document.all['txtLocation'].value = results.Location; 
    document.all['txtInterfaceID'].value = results.InterfaceID; 
    document.all['selActive'].value = results.Active ? "true" : "false"; 
    document.all['hdnLocationID'].value = results.ID.toString(); 
} 

function getError(errorInfo, context, methodName) { 
    Alert(methodName + " : " + errorInfo); 
    document.all['txtLocation'].value = ""; 
    document.all['txtInterfaceID'].value = ""; 
    document.all['selActive'].value = "false"; 
    document.all['hdnLocationID'].value = ""; 
} 

編輯添加:以上所有基於ASMX,我仍然會去WCF,多功能性和定義數據合同的能力。此外,調查WCF RIA服務;他們的目標是支持AJAX和Silverlight,並且它自動化了WCF的大部分配置。

4

WCF模型非常靈活,本質上 - 如果你只使用使用它來使用basic-profile和xml以及代理對象來呈現一個基本的http模型 - 它會顯得非常相似。

的差異的簡短列表雖然:

  • 新興標準(儘管WSE2和WSE3可供ASMX,它是在WCF都簡單得多)
  • MTOM內置的更好的支持(和修復了我記得在MTE的WSE3中發現的一個已知的bug)
  • 支持的傳輸/協議等的範圍更廣泛,並且行爲是完全可配置/可擴展的;例如,允許您使用自定義的串行/協議/運輸/等無縫,只是通過改變配置
  • 更豐富的配置,無論是在配置和運行
  • 檢查員和定製校長分享
  • 能力全面支持如果你想要的對象模型
  • 你可以託管它在網絡服務器之外;一個控制檯EXE或服務,例如