Visual Studio/SOAP -“添加服务引用”与“添加 Web 服务引用”
Posted
技术标签:
【中文标题】Visual Studio/SOAP -“添加服务引用”与“添加 Web 服务引用”【英文标题】:Visual Studio/SOAP - 'Add Service Reference' vs 'Add Web Service Reference' 【发布时间】:2011-01-12 15:52:25 【问题描述】:我发现我可以将我计划使用的 SOAP/WSDL 服务作为“Web 服务参考”(System.Web.Services) 或“服务参考”(System.ServiceModel) 导入到我的解决方案中/WCF)。
我想知道有什么不同。我知道“添加服务引用”/WCF 较新,在 System.Web.Services 上使用它是否有任何缺点,或者它现在是在 .Net 中使用 SOAP 服务的首选方式吗?
【问题讨论】:
【参考方案1】:我认为其中一个区别在于服务的自动生成代理代码。如果您使用服务引用,您的应用程序将需要 WCF 层进行通信。这通常不是问题,但如果您正在编写将在其他平台(如 Mono)上运行的代码,您将希望使用 Web 服务引用来代替(因为 Mono 还不支持 WCF。)
【讨论】:
【参考方案2】:首选和最有用的方法确实是使用Add Service Reference
。这会将您的服务添加为 WCF 客户端代理。
Add Web Reference
是“老式”的 ASMX/ASP.NET Web 服务做事方式。
WCF 是比 ASMX 更好的选择,因为:
较新,将来会支持(ASMX 即将退出);如果你现在学,以后ASMX肯定没了你就不用学了 它在各个方面都提供了更大的灵活性 您只能托管一个 ASMX 服务是 IIS,使用 HTTP 作为您的协议; WCF 可以托管在 IIS 中;在 Windows NT 服务中自托管; WCF 可以使用 HTTP、NetTCP、MSMQ 和更多协议 WCF 提供了更多的安全性和其他设置,使其使用起来更加强大是的,WCF 对很难学习有不好的评价——我并不认为这是真的。查看那些初学者的资源 - 确实非常有用!
MSDN WCF Developer Center 包含从初学者教程到文章和示例代码的所有内容 Endpoint.TV screen cast series by Aaron Skonnard on WCF (at Channel9) - 这是一个很好的系列,从“Creating your first WCF service”和“Creating your first WCF client”一直到相当高级的主题。 Aaron Skonnard 在 10 到 15 分钟的截屏视频中很好地解释了所有内容 - 强烈推荐! DotNet Rocks 电视节目 #122:Miguel Castro on Extreme WCF DotNet Rocks 电视节目 #135:Keith Elder Demystifies WCF【讨论】:
感谢马克的链接!一直在寻找更多信息。 :) @fretje:是的,抱歉 - 他们决定让他们自己网站上的截屏视频仅供订阅者使用.....我会尝试在 WCF 开发人员中心再次找到这些并更新链接……等等…… @fretje:好的,修复了链接 - Aaron Skonnard 的截屏视频在 Channel9 网站的“Endpoint.TV”保护伞下 - 尽情享受吧!【参考方案3】:我有一个应用程序正在调用以 J2EE 编写并托管在 WebSphere 中的现有 SOAP 服务。
我创建了两个控制台应用程序 - 一个将服务引用为老式 Web 服务,另一个将其引用为服务引用。
在这两种情况下,Visual Studio 都会为服务创建一个代理类和适当的配置条目。
在服务参考控制台应用程序中,我获得了更多在 Web 服务应用程序中看不到的配置选项。特别是我可以设置最大消息大小等。
事实上,为了让服务参考控制台应用程序正常工作,我不得不增加默认消息大小,以便取回在其中一个方法调用中发送的所有数据。
服务参考应用中的配置如下所示:
<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 之间混合和匹配。
【讨论】:
以上是关于Visual Studio/SOAP -“添加服务引用”与“添加 Web 服务引用”的主要内容,如果未能解决你的问题,请参考以下文章
如何只用visual c++编译器而不安装visual studio