选择啥? .net 3.5 中的 ASMX Web 服务或 WCF?
Posted
技术标签:
【中文标题】选择啥? .net 3.5 中的 ASMX Web 服务或 WCF?【英文标题】:What to choose? ASMX web service or WCF in .net 3.5?选择什么? .net 3.5 中的 ASMX Web 服务或 WCF? 【发布时间】:2011-01-08 11:51:45 【问题描述】:我正在进行的当前项目广泛使用 Web 服务,并且是在 .net 3.5 中制作的。现在,当我们要实施第二阶段时,我们是否应该像以前那样使用 WCF 或 Web 服务?此外,是否有任何新的有用的东西,以及关于 Web 服务或 WCF 的 .net 4.0。
【问题讨论】:
【参考方案1】:我们刚刚完成了第一次使用 WCF 而不是 ASMX Web 服务的全新项目。我们对结果非常满意,但确实知道学习曲线陡峭。即便如此,我们对整体结果感到非常满意,并且知道这是 Microsoft 未来所做的一切的基础,并且完全值得付出痛苦 - 疣和所有。
我们通过 ASMX 获得的快速收益:
1) 对于内部(防火墙后)服务到服务调用,我们使用 net:tcp 绑定,它比 SOAP 快得多
2) 我们在同一个服务上同时启用了 net:tcp 端点和“web”端点,只更新了配置文件(没有代码更改)
3) 我们能够创建支持 AJAX 的 RESTful Web 服务,只需更改配置并使用已内置的 DataContractJsonSerializer。否则,我们将不得不编写一个 HTTP 处理程序 (ashx) 并处理大部分手动Json序列化和url解析。
4) 由于我们的站点需要扩展以实现性能优化和稳定性,我们正在考虑转换为使用基于 MSMQ 的消息传递结构,该结构是异步且有保证并参与事务的; WCF 提供了一个 MSMQ 绑定,几乎不需要对我们的服务进行任何代码更改——只需引用更新并使用现有服务正确设置 MSMQ(并为事务边界添加属性)。
但请注意:真正投入学习这一点(购买蓝色的 O-Reily 书并仔细阅读)。开发过程中的参数名称更改之类的事情实际上不会破坏服务引用,但会导致传递空参数(内置版本偏差处理)、要考虑的托管模型(Windows 服务与 IIS)和实例化模型和 FaultExceptions 都非常了解。我们没有进去,我们有些痛苦。但我们奋力前行,对我们的学习以及不再与 ASMX 绑定的灵活性和增长机会感到非常满意!
【讨论】:
Tony 是值得付出努力的更新...我的意思是,从 asmx 切换到 WCF 时,您是否看到了相当大的性能、功能和灵活性增强? 更多关于性能的信息:msdn.microsoft.com/en-us/library/bb310550.aspx HotTester - 是的,是的,是的。同样,强大的力量伴随着学习它的巨大责任。但一切都值得。在内部服务中不使用 SOAP over HTTP 性能会更好,但您可以在需要配置时轻松公开相同服务的 Web 端点。 @Tony 关于第 (3) 点 - 使用 asmx,您可以通过使用属性 [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 装饰您的方法来启用 json 序列化。不过,很棒的帖子。【参考方案2】:ASMX 很棒而且很简单 - 但它在很多方面都非常有限:
您只能在 IIS 中托管您的 Web 服务 您只能通过 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 分钟的截屏视频中很好地解释了所有内容 - 强烈推荐!
【讨论】:
【参考方案3】:WCF 模型更加灵活,本质上 - 如果您仅使用它来呈现一个使用 basic-profile 和 xml 以及代理对象的基本 http 模型 - 它看起来会非常相似。
一个简短的差异列表:
更好地支持新兴标准(虽然 WSE2 和 WSE3 可用于 asmx,但在 WCF 中都更简单) 内置 MTOM(并修复了我记得在 WSE3 中使用 MTOM 发现的一个已知错误) 支持的传输/协议等范围更广,并且行为是完全可配置/可扩展的;例如允许您使用自定义序列化程序/协议/传输/等,只需更改配置即可 更丰富的配置,无论是在配置还是运行时 全面支持检查员和自定义主体 可以根据需要共享对象模型 您可以在网络服务器之外托管它;控制台 exe 或服务,例如【讨论】:
【参考方案4】:在开始使用 WCF 之前需要考虑不同的点:
WCF 在架构上更加健壮并促进最佳实践。 如果您知道自己在做什么,那么它的“丝般光滑”如果不知道,那么您就可以 骑车。 您是否有足够的时间来完成服务的转换?
最后我想说的是,如果你有时间、有实力和实力进行升级。这很值得。如果 asmx 能够满足所有需求,您可能会坚持使用 Web 服务。
【讨论】:
【参考方案5】:另外两个方面:
无论您如何为服务器端做出决定,您都可以在客户端仅使用 WCF 轻松使用 Web 服务和 WCF 服务。如果您使用单个客户端使用多个服务,这很有价值。
您询问了即将推出的主题。如果您考虑云计算:可以在 Windows Azure 上托管 WCF 服务。
【讨论】:
【参考方案6】:对于 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 的大部分配置。
【讨论】:
以上是关于选择啥? .net 3.5 中的 ASMX Web 服务或 WCF?的主要内容,如果未能解决你的问题,请参考以下文章
.NET 2 ASMX Web 服务 - 通过 .NET 3.5 服务参考调用 - 通用类重用
asp.net framework 4.5 中的 ashx、asmx、axd + cs(handler)、webmethod(in aspx) 和 async 方法有啥区别? [关闭]
有啥方法可以处理 ASMX 服务后面的 async/await 吗?