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

如何只用visual c++编译器而不安装visual studio

dev文件用visual studio怎么打开

visual studio 2005 图像上 添加 数字

如何利用visual studio2015编写uwp应用

visual studio 如何生成动态库