Visual Studio/SOAP - 'Add Service Reference'和'Add Web Service Reference'的区别

17
我发现我可以将我计划使用的SOAP/WSDL服务作为“Web Service Reference”(System.Web.Services)或“Service Reference”(System.ServiceModel / WCF)导入我的解决方案。
我想知道它们之间的区别。我知道“Add Service Reference”/WCF更加新,但是跟System.Web.Services相比,是否有任何缺点?或者现在在.NET中消费SOAP服务的首选方式是使用哪一种?
3个回答

20

首选且最有用的方法确实是使用Add Service Reference。这将会将您的服务添加为 WCF 客户端代理。

Add Web Reference 是“旧式”的 ASMX/ASP.NET Web 服务处理方式。

相比 ASMX,WCF 是更好的选择,因为:

  • 它是较新的技术并且未来会得到支持(ASMX 将逐渐被淘汰);如果您现在学习它,以后就无需再去学习已经被淘汰的 ASMX 了
  • WCF 在各个方面都提供了很多灵活性
  • 您只能在 IIS 中托管 ASMX 服务,并使用 HTTP 作为协议;WCF 可以在 IIS 中进行托管、在 Windows NT 服务中进行自主托管,还可以使用 HTTP、NetTCP、MSMQ 等多种协议
  • WCF 提供了更多的安全和其他设置,使之更加强大易用

是的,WCF 被认为很难学 - 我不太认同这一点。看看那些初学者资源 - 非常有用!

  • DotNet Rocks电视节目#122: Miguel Castro谈WCF极限编程
  • DotNet Rocks电视节目#135:Keith Elder解读WCF

  • 谢谢链接,马克!一直在寻找更多信息。 :) - Tad Donaghe
    @fretje:是的,抱歉——他们决定仅将其网站上的屏幕录像提供给订阅者。我会尝试在WCF开发人员中心找到它们并更新链接……稍等片刻。 - marc_s
    1
    @fretje:好的,链接已修复 - Aaron Skonnard的这些屏幕录像在Channel9网站上以“Endpoint.TV”为名发布 - 祝您愉快! - marc_s

    6
    我有一个应用程序,调用了一个已经编写在WebSphere中的J2EE SOAP服务。
    我创建了两个控制台应用程序——一个使用传统的Web服务引用该服务,另一个使用Service Reference引用该服务。
    在这两种情况下,Visual Studio都会创建代理类和适当的配置条目。
    在Service Reference控制台应用程序中,我可以看到更多的配置选项,而在Web服务应用程序中则没有。特别是,我可以设置最大消息大小等。
    实际上,为了使Service Reference控制台应用程序正常工作,我不得不增加默认消息大小,以便在其中一个方法调用中获取所有发送的数据。
    以下是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>
    

    这种方法更简单,但缺少许多Service References提供的选项。

    实际调用服务的代码在两种情况下几乎相同。

    然而,回答你的问题,我认为坚持当前的做法很重要。微软通过强制你通过一些对话框级别才能添加旧式Web Reference(至少在VS2008中)来明确这一点。

    我认为WCF方式更加灵活,并且配置对于正在发生的事情更具描述性。

    此外,随着您向应用程序添加新的WCF组件,保持配置设置一致将是不错的选择,而不是在旧式和WCF之间混合匹配。


    3

    我认为其中一个区别在于服务的自动生成代理代码。如果你选择使用服务引用,你的应用程序将需要WCF层进行通信。一般来说这不是问题,但如果你正在编写将在其他平台上运行的代码(比如Mono),那么你应该使用网络服务引用(因为Mono还不支持WCF)。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接