• vs 2008 添加 服务引用 与 web引用 差别与联系


    转自http://www.frankxulei.com/?p=156《老徐的博客》

    (1)VS2005里提供的Add Web Reference(添加Web服务引用)的功能主要是添加Web Service引用。
    (2)VS2008保留了Add Web Reference(添加Web服务引用)也是为了版本向前兼容。目前很多项目还是基于.NET Framework 2.0。
    (3)VS2008在升级以后为了对.NET Framework 3.0 或 3.5版本上WCF Service Library的支持。增加了Add Service Reference(添加服务引用)功能。Framework3.0 或 3.5 时可用。

    同时存在Add Service Reference、Add Web Reference 两者情况的项目类型是Web服务程序。包括Web Service项目。普通的控制台等类型是没有Add Web Reference 。
    我仔细对比了两种方式添加同一个 WebService生成的客户端文件 Reference.cs, 有差别。
    1.主要添加引用都有一个获取服务元数据,反序列话本地类文件的过程。这个结构也基本类似。都包含wsdl\discovery等文件。
    这个也和WCF Service支持Web Service的核心行业标准有关系。毕竟WCF的特性之一就是兼容Web Service的特性。
    2.不同的地方时Add Web Reference 生成的 Reference.cs文件里,包含一个服务代理类,他负责与Web服务通信,它继承一个Soap类,使用SOAP协议,SOAP简单对象访问协议,基于XML语言。此外还包含一些Web服务类里定义的方法,和与之相关的异步调用方法和事件。遵守.NET Web Service 的主要规则。
    3.Add Service Reference生成的客户端文件 Reference.cs。我看了一下,这个也会反序列化一个本地代理类,很相似和前者。不过除了服务类和其相关的一些别的类和契约接口。其中比较重要就是一个契约和一个通信管道。这个主要和WCF框架
    的编程模型和反序列话机制有关系。因为WCF 强调的是 契约的概念,还有就是绑定协议,这个就直接决定了客户端和服务端通信的通道类型。你在这个文件里也能看到。此外还有服务请求和相应对应的信息。遵循WCF服务框架的规则。

    =================================================================================

    以下转自http://www.cnblogs.com/wang_yb/archive/2010/04/28/1723332.html

    很早就发现在vs2008中应用web service有两种方式,即Add Web Reference和Add Service Reference,但是一直不是很清楚这两者有什么区别。趁着今天有空实验一下这两者的区别并记录下来供大家参考。

    首先在网上查找,发现有如下两个主要区别:

    1.Add Web Reference是由wsdl.exe生成客户端代理的。

       Add Service Reference是由svcutil.exe生成客户端代理的。

    2.Add Web Reference生成的代理可以被.net1.1或.net2.0的客户端调用

       Add Service Reference生成的代理只能被.net3.0+的客户端调用,而且Add Service Reference后不仅生成代理类,在web.config中还会生成相应的Tag。

    首先建立一个solution,在其中增加三个工程(一个WebApplication,一个Webservice,一个Wcfservice)。

    1.测试Web Reference


    (1.1)在WebApplication中引用WebService(即WebServiceForTest)

         引用后可正常使用,web.config中多出如下配置(url上的端口号和个人机器相关)

    <applicationSettings>
    <WebReferAndSvcRefer.Properties.Settings>
    <setting name="WebReferAndSvcRefer_AsmxWebRefer_Service1"
    serializeAs="String">

    <value>http://localhost:1253/Service1.asmx"</value>
    </setting>
    </WebReferAndSvcRefer.Properties.Settings>
    </applicationSettings

    (1.2) 在WebApplication中引用WcfService(即WcfServiceForTest)

           引用后无法正常使用,web.config中多出的配置和上面类似

    <applicationSettings>
    <WebReferAndSvcRefer.Properties.Settings>
    <setting name="WebReferAndSvcRefer_WcfWebRefer_Service1"
    serializeAs="String">
    <value>http://localhost:1254/Service1.svc</value>
    </setting>
    </WebReferAndSvcRefer.Properties.Settings>
    </applicationSettings>

    2.测试Service Reference

    (2.1)在WebApplication中引用WebService(即WebServiceForTest)

       引用后可正常使用,web.config中多出如下配置(url上的端口号和个人机器相关)

    <system.serviceModel>
    <bindings>
    <basicHttpBinding>
    <binding name="Service1Soap" closeTimeout="00:01:00"
    openTimeout="00:01:00"
    receiveTimeout="00:10:00" sendTimeout="00:01:00"
    allowCookies="false"
    bypassProxyOnLocal="false"
    hostNameComparisonMode="StrongWildcard"
    maxBufferSize="65536" maxBufferPoolSize="524288"
    maxReceivedMessageSize="65536"
    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://localhost:1253/Service1.asmx" binding="basicHttpBinding"
    bindingConfiguration="Service1Soap"
    contract="AsmxSvcRefer.Service1Soap" name="Service1Soap" />
    </client>

    </system.serviceModel>

    (2.2)在WebApplication中引用WcfService(即WcfServiceForTest)

        引用后可正常使用,web.config中多出如下配置(url上的端口号和个人机器相关)

    <system.serviceModel>
    <bindings>
    <wsHttpBinding>
    <binding name="WSHttpBinding_IService1"
    closeTimeout="00:01:00"
    openTimeout="00:01:00" receiveTimeout="00:10:00"
    sendTimeout="00:01:00"
    bypassProxyOnLocal="false" transactionFlow="false"
    hostNameComparisonMode="StrongWildcard"
    maxBufferPoolSize="524288"
    maxReceivedMessageSize="65536"
    messageEncoding="Text" textEncoding="utf-8"
    useDefaultWebProxy="true"
    allowCookies="false">
    <readerQuotas maxDepth="32" maxStringContentLength="8192"
    maxArrayLength="16384"
    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
    <reliableSession ordered="true" inactivityTimeout="00:10:00"
    enabled="false" />
    <security mode="Message">
    <transport clientCredentialType="Windows"
    proxyCredentialType="None" realm="" />
    <message clientCredentialType="Windows"
    negotiateServiceCredential="true"
    algorithmSuite="Default" establishSecurityContext="true" />
    </security>
    </binding>
    </wsHttpBinding>
    </bindings>
    <client>
    <endpoint address="http://localhost:1254/Service1.svc"
    binding="wsHttpBinding"
    bindingConfiguration="WSHttpBinding_IService1"
    contract="WcfSvcRefer.IService1"
    name="WSHttpBinding_IService1">
    <identity>
    <dns value="localhost" />
    </identity>
    </endpoint>
    </client>

    </system.serviceModel>

    3.测试客户端的.net framework要求

    将WebApplication(即WebReferAndSvcRefer)的Target Framework降为2.0


    然后发现在WebReferAndSvcRefer中无法引用Service Reference,证明了Add Service Reference生成的代理只能被.net3.0+的客户端调用。

    4.总结

    以上的实验过程基本证明了本文开头提到的两个区别,其中(1.2)Add Web Reference的方式不能使用Wcf也证明了Add Web Reference生成的代理是面向.net1.1或.net2.0的客户端的(wcf需要.net3.0的支持)。

    ==================================================================================

            这样说来,说是向上兼容,其实并不是真的向上兼容,“服务引用”的作用范围应该更广泛,(如果装上了.net3.0客户端),应该可以以“服务引用”的方式去调用WebService。
           如何在vs2008中使用“服务引用”去调用Web Service呢?

           假如你要调用一个java编写的WebService类Test.java)

           (1)如果你添加的是web引用,vs会自动生成一个“类名+Service”的类去对照Java的类,本例应该是TestService类。调用这个类就相当于调用Java中的Test类。  

           (2)查如果你添加的是服务引用,vs会自动生成一个“类名+Client”的类去对照Java的类,本例应该是TestCilent类。调用这个类就相当于调用Java中的Test类。

  • 相关阅读:
    浏览器 显示一个对话框,对话框中包含一条文字信息,用来提示用户输入文字。window.prompt()
    JS字符串转换为JSON对象的四种方法
    js中 json对象与json字符串相互转换的几种方式 $.parseJSON(jsonStr)json字符串转换为json对象
    C#变量命名规则(命名规范)
    C#中AppDomain.CurrentDomain.BaseDirectory(获取程序的基目录)及各种路径获取方法
    C# 的 Path.GetFileName、Path.GetExtension、Path.GetDirectoryName千一网络 http://www.itpow.com/
    js计算两个时间相差天数,获取时间的毫秒数之差
    C#将DataTable转化为List<T>
    https://www.cnblogs.com/sizhizhiyue/p/4820973.html asp.net后台导出excel的方法一:使用response导出excel
    .NET调用AS/400上的程序(.NET CALL AS/400 PGM)
  • 原文地址:https://www.cnblogs.com/aaa6818162/p/2208725.html
Copyright © 2020-2023  润新知