选择什么? ASMX Web服务或.net 3.5中的WCF?

时间:2010-01-23 04:52:57

标签: .net wcf web-services .net-3.5 asmx

我正在处理的当前项目是广泛使用Web服务,并在.net 3.5中制作。现在,当我们要实施第二阶段时,如果我们应该像之前那样使用WCF或Web服务,我们会感到困惑吗?还有一些有用的新东西,并且提出了关于Web服务或WCF的.net 4.0。

6 个答案:

答案 0 :(得分:26)

我们刚刚首次使用WCF而不是ASMX Web Services完成了一个全新的项目。我们对结果非常满意,但确实知道有一个陡峭的学习曲线。即便如此,我们对整体结果非常满意,并且知道这是微软未来所做的一切的基础,而且完全值得痛苦 - 疣和所有。

我们通过ASMX获得的快速收益

1)对于内部(防火墙后)服务到服务调用,我们使用net:tcp绑定,这比SOAP快得多

2)我们在同一服务上同时启用了net:tcp端点和“web”端点,只更新了配置文件(没有代码更改)

3)我们能够创建支持AJAX的RESTful Web服务,仅使用配置更改并使用已经内置的DataContractJsonSerializer。否则,我们将不得不编写HTTP Handler(ashx)并处理大部分Json序列化和url手工解析。

4)由于我们的网站需要扩展性能优化和稳定性,我们正在寻求转换为使用基于MSMQ的消息传递结构,该结构是异步的并且保证并参与事务; WCF提供了一个MSMQ bindng,它在我们的服务中几乎不需要更改代码 - 只需参考更新并使用现有服务正确设置MSMQ(并为事务边界添加属性)。

但是要警告:真正投资于学习(购买蓝色的O-Reily书并完成它)。在开发过程中有些参数名称更改实际上不会破坏服务引用但会导致传递空参数(内置版本偏差处理),托管要考虑的模型(Windows服务与IIS)以及实例化所有模型和FaultExceptions真正理解。我们没有进去,我们有一些痛苦。但我们继续前进,对我们的学习以及我们不再与ASMX联系的灵活性和增长机会非常满意!

答案 1 :(得分:11)

ASMX非常简单 - 但它在很多方面都非常有限:

  • 您只能在IIS中托管您的网络服务
  • 您只能通过HTTP访问您的网络服务
  • 安全性非常有限

WCF可以解决这个问题 - 并提供更多功能。您可以根据需要在IIS中托管您的WCF服务 - 或者在控制台应用程序或Win NT服务中托管自托管服务器。您可以使用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”一直到相当高级的主题。 Aaron Skonnard在10-15分钟的截屏视频中很好地解释了所有内容 - 强烈推荐!

答案 2 :(得分:4)

WCF模型实际上非常灵活 - 如果你 使用它来使用基本配置文件和xml来呈现基本的http模型,使用代理对象 - 它看起来非常相似。 / p>

虽然有一些简短的差异清单:

  • 更好地支持新兴标准(虽然WSE2和WSE3可用于asmx,但它在WCF中更简单)
  • MTOM内置(并修复了我记得在WSE中使用MTOM找到的已知错误)
  • 支持的传输/协议等范围更广,行为完全可配置/可扩展;例如,允许您无限地使用自定义序列化器/协议/传输/等,只需更改配置
  • 即可
  • 在配置和运行时更丰富的配置
  • 全面支持检查员和自定义负责人
  • 如果您愿意,可以共享对象模型
  • 您可以在网络服务器之外托管它;控制台exe或服务,例如

答案 3 :(得分:3)

在跳转到WCF之前需要考虑不同的几点:

  
      
  1. WCF在架构上更强大,并推广最佳实践。
  2.   
  3. 如果你知道自己在做什么,那么它“丝般顺畅”,如果不是你的话   程。
  4.   
  5. 您是否有足够时间完成服务转换?
  6.   

最后我会说,如果你有时间,金光闪闪和肌肉做升级。这很值得。如果asmx满足所有需求,您可以继续使用Web服务。

答案 4 :(得分:3)

另外两个方面:

  1. 无论您如何为服务器端做出决定,您都可以在客户端仅使用WCF轻松使用Webservices和WCF服务。如果您使用单个客户端使用多个服务,这是有价值的。

  2. 您要求即将推出的主题。如果您考虑云计算:可以在Windows Azure上托管WCF服务。

答案 5 :(得分: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>

此外,您可以通过添加ScriptService和ScriptMethod属性使ASMX发送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的大部分配置。