【问题标题】:Visual Studio/SOAP - 'Add Service Reference' vs 'Add Web Service Reference'Visual Studio/SOAP -“添加服务引用”与“添加 Web 服务引用”
【发布时间】:2011-01-12 15:52:25
【问题描述】:

我发现我可以将我计划使用的 SOAP/WSDL 服务作为“Web 服务参考”(System.Web.Services) 或“服务参考”(System.ServiceModel) 导入到我的解决方案中/WCF)。

我想知道有什么不同。我知道“添加服务引用”/WCF 较新,在 System.Web.Services 上使用它是否有任何缺点,或者它现在是在 .Net 中使用 SOAP 服务的首选方式吗?

【问题讨论】:

    标签: .net wcf web-services visual-studio 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 对很难学习有不好的评价——我并不认为这是真的。查看那些初学者的资源 - 确实非常有用!

      【讨论】:

      • 感谢马克的链接!一直在寻找更多信息。 :)
      • @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 之间混合和匹配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-13
        • 2011-01-23
        • 1970-01-01
        • 2019-11-12
        • 1970-01-01
        • 1970-01-01
        • 2013-09-02
        相关资源
        最近更新 更多