学会使用Web Service下(客户端访问)/(服务器端访问)

摘要:
简而言之,Web服务为Web应用程序提供了相互共享资源的可能性。本文只是想告诉您如何使用Web服务。我将主要从两个方面介绍它:服务器端对WebService的访问和客户端对WebService。如果你不知道如何使用WebService,我希望它能帮助你。是否使用
http://www.cnblogs.com/ruihua/archive/2007/10/28/940287.html
http://www.cnblogs.com/ruihua/archive/2007/10/28/939932.html

学会使用Web Service上(服务器端访问)

    关于什么是Web Service,相信在很多地方都会有介绍。简单的讲,Web Service就是为Web应用程序之间彼此共享资源提供了一种可能。采取的方式是将相应的类及其中的方法暴露出来,然后调用者就可以直接调用这些类中的 方法,达到访问远程资源的目的。本文只是想告诉,如果去使用Web Service。我主要从服务器端访问Web Service、客户端访问Web Service两方面来介绍。如果你还不会使用Web Service,希望对你有所帮助。
一、服务器端访问Web Service
   这也是Web Service最适宜的调用环境。我们只需知道一个远程Web Service的URL,然后我们就可以直接使用Wsdl工具或更方便的添加Web 引用的方法,将远程Web Service(指.asmx文件)中对应类生成一个强类型的本地化代理。通过这个代理,我们就可以像使用本地方法一样,去调用这个远程类中的方法。使用 的过程是非常的简单。下面让我们看看具体的操作。
    1、新建一个Web Service
学会使用Web Service下(客户端访问)/(服务器端访问)第1张
选择asp.net Web服务模板,然后你会看到VS已经自动为我们生成了一个Web Service的示例代码。

学会使用Web Service下(客户端访问)/(服务器端访问)第2张using System;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
using System.Web;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
using System.Web.Services;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
using System.Web.Services.Protocols;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[WebService(Namespace 
= "http://tempuri.org/")]
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
public class Service : System.Web.Services.WebService
学会使用Web Service下(客户端访问)/(服务器端访问)第10张学会使用Web Service下(客户端访问)/(服务器端访问)第11张
学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    
public Service () 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
//如果使用设计的组件,请取消注释以下行 
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
//InitializeComponent(); 
学会使用Web Service下(客户端访问)/(服务器端访问)第19张
    }

学会使用Web Service下(客户端访问)/(服务器端访问)第16张
学会使用Web Service下(客户端访问)/(服务器端访问)第16张    [WebMethod]
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    
public string HelloWorld() 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
return "Hello World";
学会使用Web Service下(客户端访问)/(服务器端访问)第19张    }
 
学会使用Web Service下(客户端访问)/(服务器端访问)第27张}

     一个Web Service的主要部分VS已经帮我们写好了。这里有几个地方,我大概说一下。[WebService(Namespace = http://tempuri.org/)]特 性部分,它声明了Web Service所对应的XMl文件的命名空间,如果你直接浏览Web Service文件,它会出现在XML文件的命名空间声明中。还是建议修改一下Namespace,虽然它只是一个URI。比如你可以把它改为 Namespace=http://ruihua.cnblogs.com/。[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]特性声称的是本Web Service所应符合的Web服务互操作性规范,一般情况下我们无需考虑这个,只有某些操作与这个规范不相符的时候,我们就需要修改ConformsTo = WsiProfiles.None。(比如BasicProfile1_1规范并不支持方法的重载,如果你有重载方法的话,就需要修改它。)需要特别说明 的是,通常一个web Service文件对应的只有一个类,当然并不是说你不可以在一个.asmx文件中写多个类,但只有与WebService指令中的className值 对应的那个类才会被公开。而对于类中的方法,我们必须显式加上[WebMthod]特性,才能被公开,这点与类不同。让我们看一下WebMethod特性 的一些其它属性:

属性

功能

示例

BufferResponse设置为True时,XML Web服务的响应就保存在内存中,并发送为一个完整的包。如果该属性设置为False,则响应在服务器上构造的同时,会发送给客户机。[WebMethod(BufferResponse=true)]
CacheDuration指定响应在系统的高速缓存中的保存时间(秒),默认值为0,表示禁用高速缓存。把XML Web服务的响应放在高速缓存中,会提高Web服务的性能。    [WebMethod(BufferResponse=true,
CacheDuration=30)]
Description对在XML Web服务的测试页面上显示的Web Method应用文本的描述。

[WebMethod(Description="该方法用于获取一个简单的字符串")]

EnableSession设置为True时,会激活Web Method的会话状态,其默认值为False。[WebMethod(EnableSession=true)]
MessageName给Method指定一个唯一的名称,如果要使用重载的Web Method,则必须指定。[WebMethod(MessageName="Method1")]
TransactionOption为Web Method指定事务的支持,其默认值为Disbled。如果Web Method是启动事务的根对象,Web服务就可以用另一个需要事务处理的WebMethod参与事务处理。其值可以是NotSupported、 Supported、Required和RequiresNew。[WebMethod(TransactionOption
=System.EnterpriseServices.
TransactionOption.Supported)]


我们修改一下上述代码。

学会使用Web Service下(客户端访问)/(服务器端访问)第2张using System;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
using System.Web;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
using System.Web.Services;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
using System.Web.Services.Protocols;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[WebService(Namespace 
= "http://tempuri.org/")]
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[WebServiceBinding(ConformsTo 
= WsiProfiles.None)]
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
public class Service : System.Web.Services.WebService
学会使用Web Service下(客户端访问)/(服务器端访问)第10张学会使用Web Service下(客户端访问)/(服务器端访问)第11张
学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
public Service () 
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    
学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张
学会使用Web Service下(客户端访问)/(服务器端访问)第19张    }

学会使用Web Service下(客户端访问)/(服务器端访问)第16张
学会使用Web Service下(客户端访问)/(服务器端访问)第16张    [WebMethod]
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    
public string Hello(string name) 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
return string.Format("Hello,{0}!Current Time is :{1}", name, DateTime.Now.ToString());
学会使用Web Service下(客户端访问)/(服务器端访问)第19张    }
 
学会使用Web Service下(客户端访问)/(服务器端访问)第27张}

程序很简单,传进去一个姓名,返回一串提供信息,下面我们来看一下如何使用这个Web Service.

2、访问Web Service
   首先需要说明一下,为何我们能够在本地服务器上访问到远程服务器的Web Service?无论是使用添加Web引用的方式还是使用Wsdl工具,最终的结果都是生成了一个远程Web Service中类的强类型化本地代理。然后我们是通过这个代理来实现访问远程资源访问的。下面我们看看怎么通过这两种方式来实现。
   首先我们新建一个新的Web应用程序
   方式一:使用添加Web 引用。在解决方案资源管理器中单击右键,选择添加Web 引用...,如下所示:
学会使用Web Service下(客户端访问)/(服务器端访问)第53张
在URL部分你可以直接输入远程Web Service的URL,当然如果引用的Web Service来自本地,你可以单击相应的链接,然后进行选择。在Web引用名中,填入你自定义的名称。注意,这个名称就代指Web Service的命名空间。在访问的时候,我们必须通过这个名称才能引用到Web Service中的类。填好后,单击添加引用即可。
学会使用Web Service下(客户端访问)/(服务器端访问)第54张

 为了保证本地测试方便,请将Web Service所在网站设为Web 共享,这样我们就不必考虑在Web引用中加入端口号才能访问的问题。添加Web引用对话框中查找的实际是WSDL文件,Microsoft的XML Web服务会根据.asmx文件自动生成wdsl文件。当然,我们也可以根据.asmx文件在浏览器中打开wsdl文件,按如下路径:
http://localhost/WebService/Service.asmx?wsdl
接下来,你会看到VS已经为我们添加好了Web 引用。
学会使用Web Service下(客户端访问)/(服务器端访问)第55张

同时在Web.Config文件中也包含了对Web服务的引用,如下所示:
<appSettings>
 <add key="ServiceNamespace.Service" value="http://localhost/WebService/Service.asmx"/>
 </appSettings>
接下来,让我们看一下如何使用这个Web Service,请看代码:

学会使用Web Service下(客户端访问)/(服务器端访问)第2张public partial class _Default : System.Web.UI.Page
学会使用Web Service下(客户端访问)/(服务器端访问)第10张学会使用Web Service下(客户端访问)/(服务器端访问)第11张
学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
protected void Page_Load(object sender, EventArgs e)
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    
学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        ServiceNamespace.Service ws 
= new ServiceNamespace.Service();
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        Response.Write(ws.Hello(
"Ruihua"));
学会使用Web Service下(客户端访问)/(服务器端访问)第19张    }

学会使用Web Service下(客户端访问)/(服务器端访问)第27张}

你会看到,使用远程方法就像使用本地方法一样简单,下面是运行结果:
学会使用Web Service下(客户端访问)/(服务器端访问)第68张
原因是:Web Service不允许我们以匿名的方式访问。你可以在IIS信息服务中Web Service所在站点开启这项功能。然后,你就可以看到正确结果了:
学会使用Web Service下(客户端访问)/(服务器端访问)第69张

  方式二:使用WSDL工具。
   我们也可以使用VS自带的wsdl工具来实现相同的功能,这个工具可以将wsdl文件生成在本地生成一个强类型的类文件,然后我们可以就可以直接在项目中使用这个类文件,来访问远程资源。打开VS命令提供,输入以下命令,如下图所示:
学会使用Web Service下(客户端访问)/(服务器端访问)第70张
同时在C:\Program Files\Microsoft Visual Studio 8\VC下会自动生成一个Service.cs的文件。我们将这个文件置于我们的项目中,就可以直接使用了。

学会使用Web Service下(客户端访问)/(服务器端访问)第71张学会使用Web Service下(客户端访问)/(服务器端访问)第72张WSDL命令参数:
学会使用Web Service下(客户端访问)/(服务器端访问)第2张Microsoft(R) Web Services 描述语言实用工具
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[Microsoft (R) .NET Framework, Version 
2.0.50727.42]
学会使用Web Service下(客户端访问)/(服务器端访问)第2张Copyright (C) Microsoft Corporation. All rights reserv
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张wsdl.exe 
-
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    使用 ASP.NET,根据 WSDL 协定文件、XSD 架构和 .disc
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    发现文档,为 Xml Web Services 客户端和 Xml Web Ser
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    代码的实用工具。此工具可以与 disco.exe 一起使用。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张wsdl.exe 
<选项> <URL 或路径> <URL 或路径> 学会使用Web Service下(客户端访问)/(服务器端访问)第12张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张     
- 选项 -
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
<URL 或路径> -
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    指向 WSDL 协定、XSD 架构或 .discomap 文档的 URL 或
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/nologo
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    取消显示版权标志。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/language:<language>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    用于生成的代理类的语言。请从“CS”、“VB”、“JS”
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    “CPP”中选择,或者为实现 System.CodeDom.Compiler.
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    的类提供一个完全限定的名称。默认语言为“CS”(CShar
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    缩写形式为“
/l:”。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/sharetypes
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    打开类型共享功能。此功能针对不同服务之间共享
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    的相同类型(命名空间、名称和网络签名必须相同)
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    创建一个具有单一类型定义的代码文件。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    请使用 http:
// URLs 作为命令行参数来引用
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
    服务,或为本地文件创建一个 discomap 文档。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/verbose
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    指定 
/sharetypes 开关时显示额外信息。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    缩写形式为“
/v”。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/fields
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    生成字段而非属性。缩写形式为“
/f”。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/order
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    为粒子成员生成显式顺序标识符。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/enableDataBinding
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    在所有生成的类型上实现 INotifyPropertyChanged 接口
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    以启用数据绑定。缩写形式为“
/edb”。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/namespace:<namespace>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    生成的代理或模板的命名空间。默认命名空间
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    为全局命名空间。缩写形式为“
/n:”。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/out:<fileName|directoryPath>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    生成的代理代码的文件名或目录路径。默认文件名是从
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    服务名派生的。缩写形式为“
/o:”。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/protocol:<protocol>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    重写要实现的默认协议。请从“SOAP”、“SOAP12”、
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    “HttpGet”、“HttpPost”中选择。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/username:<username>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/password:<password>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/domain:<domain>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    连接到要求身份验证的服务器时使用的凭据。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    缩写形式为“
/u:”、“/p:”和“/d:”。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/proxy:<url>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    用来处理 HTTP 请求的代理服务器的 URL。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    默认为使用系统代理服务器设置。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/proxyusername:<username>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/proxypassword:<password>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/proxydomain:<domain>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    连接到要求身份验证的代理服务器时使用的凭据。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    缩写形式为“
/pu:”、“/pp:”和“/pd:”。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/appsettingurlkey:<key>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    在代码生成中用来读取 URL 属性的
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    默认值的配置项。默认为不从配置
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    文件中读取。缩写形式为“
/urlkey:”。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/appsettingbaseurl:<baseurl>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    计算 URL 段时使用的基 URL。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    还必须指定 appsettingurlkey 选项。URL 段是
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    从 appsettingbaseurl 计算
学会使用Web Service下(客户端访问)/(服务器端访问)第2张     WSDL 文档中的 URL 的相对 URL 的结果。缩写形式为“
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/parsableerrors
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    输出错误,其格式与编译器报告的格式类似。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张     
- 高级 -
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/server
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    服务器开关已被否决。请改用 
/serverInterface。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    使用基于协定的 ASP.NET,为 Xml Web Services 实现生成抽象类。默认情况下,生成
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    客户端代理类。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/serverInterface
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    为 ASP.Net Web 服务的服务器端实现生成接口。将为 wsdl 文档中的每个绑定生成
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    一个接口。wsdl 单独实现 wsdl 协定(实现接口的类在类方法上不应包括下列任意一项:
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    更改 wsdl 协定的 Web 服务属性或序列化属性)。缩写形式为“
/si”。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
/parameters:<file>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    从指定的 xml 文件读取命令行选项。这样可以指定命令行中无法使用的选项,例如选择
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    生成的异步编程模型类型。有关详细信息,请参阅工具文档。缩写形式为“
/par:”。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第178张学会使用Web Service下(客户端访问)/(服务器端访问)第179张自动生成的Service.cs代码:
学会使用Web Service下(客户端访问)/(服务器端访问)第2张//------------------------------------------------------------------------------
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
// <auto-generated>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
//     此代码由工具生成。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
//     运行库版本:2.0.50727.42
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
//
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
//     对此文件的更改可能会导致不正确的行为,并且如果
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
//     重新生成代码,这些更改将会丢失。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
// </auto-generated>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
//------------------------------------------------------------------------------
学会使用Web Service下(客户端访问)/(服务器端访问)第2张

学会使用Web Service下(客户端访问)/(服务器端访问)第2张
using System;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
using System.ComponentModel;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
using System.Diagnostics;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
using System.Web.Services;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
using System.Web.Services.Protocols;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
using System.Xml.Serialization;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
// 
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
// 此源代码由 wsdl 自动生成, Version=2.0.50727.42。
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
// 
学会使用Web Service下(客户端访问)/(服务器端访问)第2张

学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第10张学会使用Web Service下(客户端访问)/(服务器端访问)第11张
/**//// <remarks/>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl""2.0.50727.42")]
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[System.Diagnostics.DebuggerStepThroughAttribute()]
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[System.ComponentModel.DesignerCategoryAttribute(
"code")]
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[System.Web.Services.WebServiceBindingAttribute(Name
="ServiceSoap", Namespace="http://ruihua.cnblogs.com/")]
学会使用Web Service下(客户端访问)/(服务器端访问)第10张学会使用Web Service下(客户端访问)/(服务器端访问)第11张
public partial class Service : System.Web.Services.Protocols.SoapHttpClientProtocol 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
private System.Threading.SendOrPostCallback HelloOperationCompleted;
学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    
/**//// <remarks/>
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    public Service() 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
this.Url = "http://localhost/WebService/Service.asmx";
学会使用Web Service下(客户端访问)/(服务器端访问)第19张    }

学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    
/**//// <remarks/>
学会使用Web Service下(客户端访问)/(服务器端访问)第16张    public event HelloCompletedEventHandler HelloCompleted;
学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    
/**//// <remarks/>
学会使用Web Service下(客户端访问)/(服务器端访问)第16张    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://ruihua.cnblogs.com/Hello", RequestNamespace="http://ruihua.cnblogs.com/", ResponseNamespace="http://ruihua.cnblogs.com/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    
public string Hello(string name) 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张        
object[] results = this.Invoke("Hello"new object[] 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第19张                    name}
);
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
return ((string)(results[0]));
学会使用Web Service下(客户端访问)/(服务器端访问)第19张    }

学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    
/**//// <remarks/>
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    public System.IAsyncResult BeginHello(string name, System.AsyncCallback callback, object asyncState) 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张        
return this.BeginInvoke("Hello"new object[] 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第19张                    name}
, callback, asyncState);
学会使用Web Service下(客户端访问)/(服务器端访问)第19张    }

学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    
/**//// <remarks/>
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    public string EndHello(System.IAsyncResult asyncResult) 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
object[] results = this.EndInvoke(asyncResult);
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
return ((string)(results[0]));
学会使用Web Service下(客户端访问)/(服务器端访问)第19张    }

学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    
/**//// <remarks/>
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    public void HelloAsync(string name) 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
this.HelloAsync(name, null);
学会使用Web Service下(客户端访问)/(服务器端访问)第19张    }

学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    
/**//// <remarks/>
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    public void HelloAsync(string name, object userState) 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张        
if ((this.HelloOperationCompleted == null)) 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张            
this.HelloOperationCompleted = new System.Threading.SendOrPostCallback(this.OnHelloOperationCompleted);
学会使用Web Service下(客户端访问)/(服务器端访问)第19张        }

学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张        
this.InvokeAsync("Hello"new object[] 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第19张                    name}
this.HelloOperationCompleted, userState);
学会使用Web Service下(客户端访问)/(服务器端访问)第19张    }

学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    
private void OnHelloOperationCompleted(object arg) 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张        
if ((this.HelloCompleted != null)) 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张            System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs 
= ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
学会使用Web Service下(客户端访问)/(服务器端访问)第16张            
this.HelloCompleted(thisnew HelloCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
学会使用Web Service下(客户端访问)/(服务器端访问)第19张        }

学会使用Web Service下(客户端访问)/(服务器端访问)第19张    }

学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    
/**//// <remarks/>
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    public new void CancelAsync(object userState) 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
base.CancelAsync(userState);
学会使用Web Service下(客户端访问)/(服务器端访问)第19张    }

学会使用Web Service下(客户端访问)/(服务器端访问)第27张}

学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第10张学会使用Web Service下(客户端访问)/(服务器端访问)第11张
/**//// <remarks/>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl""2.0.50727.42")]
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
public delegate void HelloCompletedEventHandler(object sender, HelloCompletedEventArgs e);
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第10张学会使用Web Service下(客户端访问)/(服务器端访问)第11张
/**//// <remarks/>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl""2.0.50727.42")]
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[System.Diagnostics.DebuggerStepThroughAttribute()]
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[System.ComponentModel.DesignerCategoryAttribute(
"code")]
学会使用Web Service下(客户端访问)/(服务器端访问)第10张学会使用Web Service下(客户端访问)/(服务器端访问)第11张
public partial class HelloCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
private object[] results;
学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
internal HelloCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张            
base(exception, cancelled, userState) 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
this.results = results;
学会使用Web Service下(客户端访问)/(服务器端访问)第19张    }

学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    
/**//// <remarks/>
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    public string Result 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张        
get 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张            
this.RaiseExceptionIfNecessary();
学会使用Web Service下(客户端访问)/(服务器端访问)第16张            
return ((string)(this.results[0]));
学会使用Web Service下(客户端访问)/(服务器端访问)第19张        }

学会使用Web Service下(客户端访问)/(服务器端访问)第19张    }

学会使用Web Service下(客户端访问)/(服务器端访问)第27张}

学会使用Web Service下(客户端访问)/(服务器端访问)第2张

至此,服务器端访问Web Service就到这里,下面让我们来看看客户端如何该问Web Service。
下一篇:学会使用Web Service下(客户端访问)
 

学会使用Web Service下(客户端访问)

二、客户端脚本直接访问Web Service
   借助于asp.net ajax异步通信层自动生成的客户端代理,我们也可以在客户端JS中使用与服务器端同样的语法调用定义在服务器端的Web Service的方法!下面我们分两种情况来分析:
   1、客户端直接调用本地Web Service
   默认情况下,asp.net Web Service并没有提供直接通过客户端脚本进行访问的方式,为了实现这个功能,我们必须借助于asp.net ajax框架,它为我们提供了使用JS直接调用本地Web Service完善的支持,所以对于以下的操作,你必须确保已安装了asp.net ajax框架。下面让我们看看具体如何实现:
    (1)、新建一个asp.net ajax Web站点,然后添加一个Web Service
学会使用Web Service下(客户端访问)/(服务器端访问)第340张
下面是修改后的Web Service代码:
学会使用Web Service下(客户端访问)/(服务器端访问)第2张<%@ WebService Language="C#" Class="WebService" %>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
using System;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
using System.Web;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
using System.Web.Services;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
using System.Web.Services.Protocols;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[WebService(Namespace 
= "http://ruihua.cnblogs.com/")]
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[System.Web.Script.Services.ScriptService]
学会使用Web Service下(客户端访问)/(服务器端访问)第10张学会使用Web Service下(客户端访问)/(服务器端访问)第11张
public class WebService  : System.Web.Services.WebService 学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张
学会使用Web Service下(客户端访问)/(服务器端访问)第16张    [WebMethod]
学会使用Web Service下(客户端访问)/(服务器端访问)第16张    
public string Hello(string name)
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张    
学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
return string.Format("Hello,{0}!Current Time is :{1}", name, DateTime.Now.ToString());
学会使用Web Service下(客户端访问)/(服务器端访问)第19张    }
   
学会使用Web Service下(客户端访问)/(服务器端访问)第27张}
请注意红色部分,要想使客户端能够访问到Web Service,我们必须为类添加ScriptService特性(当然,你也可以直接添加到相应的方法上)。这个特性是在asp.net ajax框架的Extension部分定义的。好了,Web Service就已经写好了,下面看看如何在客户端调用。
b、新建一个asp.net ajax站点,修改后的前台代码如下所示:
学会使用Web Service下(客户端访问)/(服务器端访问)第10张学会使用Web Service下(客户端访问)/(服务器端访问)第11张<%学会使用Web Service下(客户端访问)/(服务器端访问)第12张@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
<html xmlns="http://www.w3.org/1999/xhtml">
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
<head runat="server">
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    
<title>Untitled Page</title>
学会使用Web Service下(客户端访问)/(服务器端访问)第10张学会使用Web Service下(客户端访问)/(服务器端访问)第11张    
<script type="text/javascript">学会使用Web Service下(客户端访问)/(服务器端访问)第12张
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
function pageLoad(sender,args)
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张        
学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张            
//注意引用方式
学会使用Web Service下(客户端访问)/(服务器端访问)第16张
            WebService.Hello("Ruihua",onCompleted);
学会使用Web Service下(客户端访问)/(服务器端访问)第19张        }

学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
//异步调用后执行的回调函数
学会使用Web Service下(客户端访问)/(服务器端访问)第16张
        function onCompleted(result)
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张        
学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张            $get(
"result").innerHTML = result;
学会使用Web Service下(客户端访问)/(服务器端访问)第19张        }

学会使用Web Service下(客户端访问)/(服务器端访问)第27张    
</script>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
</head>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
<body>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    
<form id="form1" runat="server">
学会使用Web Service下(客户端访问)/(服务器端访问)第2张        
<asp:ScriptManager ID="ScriptManager1" runat="server">
学会使用Web Service下(客户端访问)/(服务器端访问)第2张            
<Services>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张                
<asp:ServiceReference Path="http://localhost/WebServiceForJS/WebService.asmx" />
学会使用Web Service下(客户端访问)/(服务器端访问)第2张            
</Services>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张        
</asp:ScriptManager>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张        
<div id="result"></div>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    
</form>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
</body>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
</html>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
代码非常简单,我们只需在ScriptManager中添加对Web Service文件的引用,然后在客户端脚本中使用[NameSpace].[ClassName].[MethodName][para1, para2,...,callbackFunction]的方式直接调用即可,然后在回调函数中接收值并进一步处理。(注意,测试过程中,请将站点都设置 为Web共享,这样在引用Web Service的时候就不必考虑到端口号,因为对于同域内不同端口的访问JS也是不可以的)。如果一切顺利,你将看到如下结果:(注意游览地址)
学会使用Web Service下(客户端访问)/(服务器端访问)第403张
以上是在客户端访问本地Web Service的情况,下面让我们看看客户端如何访问远程Web Service.

  2、客户端访问远程Web Service
  出于安全性考虑,客户端JS脚本是不可以直接访问远程Web Service的,若想实现这个功能,则必须在本地服务器端提供一个代理,透过这个代理进行访问。下面我们以访问http://www.webxml.com.cn/WebServices/WeatherWebService.asmx为例来说明。具体可采取以下两种方式:
  a、通过本地Web Service中转
  实现思路:服务器端建立一个Web Service,然后在相应的方法中调用远程Web Service的方法,客户端脚本直接访问本地Web Service中方法。
  主要代码: 
学会使用Web Service下(客户端访问)/(服务器端访问)第10张学会使用Web Service下(客户端访问)/(服务器端访问)第11张<%学会使用Web Service下(客户端访问)/(服务器端访问)第12张@ WebService Language="C#" Class="WebService" %>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张using System;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张using System.Web;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张using System.Web.Services;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张using System.Web.Services.Protocols;
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[WebService(Namespace = "http://ruihua.cnblogs.com/")]
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
学会使用Web Service下(客户端访问)/(服务器端访问)第2张[System.Web.Script.Services.ScriptService]
学会使用Web Service下(客户端访问)/(服务器端访问)第2张public class WebService  : System.Web.Services.WebService {
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    [WebMethod]
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    public string[] GetWeatherbyCityName(string theCityName)
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    {
学会使用Web Service下(客户端访问)/(服务器端访问)第2张        WeatherForcast.WeatherWebService ws = new WeatherForcast.WeatherWebService();
学会使用Web Service下(客户端访问)/(服务器端访问)第2张        return ws.getWeatherbyCityName(theCityName);
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    } 
学会使用Web Service下(客户端访问)/(服务器端访问)第2张}
前台Default.aspx代码:
学会使用Web Service下(客户端访问)/(服务器端访问)第10张学会使用Web Service下(客户端访问)/(服务器端访问)第11张<%学会使用Web Service下(客户端访问)/(服务器端访问)第12张@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
<html xmlns="http://www.w3.org/1999/xhtml">
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
<head runat="server">
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    
<title>Untitled Page</title>
学会使用Web Service下(客户端访问)/(服务器端访问)第10张学会使用Web Service下(客户端访问)/(服务器端访问)第11张    
<script type="text/javascript">学会使用Web Service下(客户端访问)/(服务器端访问)第12张
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
function btnGetWeather_onclick(sender,args)
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张        
学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张            
var cityName=$get("tbCityName").value;
学会使用Web Service下(客户端访问)/(服务器端访问)第16张            WebService.GetWeatherbyCityName(cityName,onCompleted,onFailed);
学会使用Web Service下(客户端访问)/(服务器端访问)第19张        }

学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
//异步调用后成功后执行的回调函数
学会使用Web Service下(客户端访问)/(服务器端访问)第16张
        function onCompleted(result)
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张        
学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张            
var str = new Sys.StringBuilder();
学会使用Web Service下(客户端访问)/(服务器端访问)第16张            
for(var i=0;i<result.length;i++)
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张            
学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张                str.append(result[i]);
学会使用Web Service下(客户端访问)/(服务器端访问)第16张                str.append(
"<br/>");
学会使用Web Service下(客户端访问)/(服务器端访问)第19张            }

学会使用Web Service下(客户端访问)/(服务器端访问)第16张            $get(
"result").innerHTML = str.toString();
学会使用Web Service下(客户端访问)/(服务器端访问)第19张        }

学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
//异步调用后失败后执行的回调函数
学会使用Web Service下(客户端访问)/(服务器端访问)第16张
        function onFailed(error)
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张        
学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张            $get(
"result").innerHTML = error.get_message();
学会使用Web Service下(客户端访问)/(服务器端访问)第19张        }

学会使用Web Service下(客户端访问)/(服务器端访问)第27张    
</script>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
</head>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
<body>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    
<form id="form1" runat="server">
学会使用Web Service下(客户端访问)/(服务器端访问)第2张        
<asp:ScriptManager ID="ScriptManager1" runat="server">
学会使用Web Service下(客户端访问)/(服务器端访问)第2张            
<Services>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张                
<asp:ServiceReference Path="WebService.asmx" />
学会使用Web Service下(客户端访问)/(服务器端访问)第2张            
</Services>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张        
</asp:ScriptManager>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张        
<label id="lblCityName">Please input CityName:</label>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张        
<input id="tbCityName" type="text" />
学会使用Web Service下(客户端访问)/(服务器端访问)第2张        
<input id="btnGetWeather" type="button" value="Get Weather" onclick="return btnGetWeather_onclick()" />
学会使用Web Service下(客户端访问)/(服务器端访问)第2张        
<div id="result"></div>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    
</form>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
</body>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
</html>
运行结果:
学会使用Web Service下(客户端访问)/(服务器端访问)第483张
下载本示例 

 b、使用Web Service Bridge
   asp.net ajax中Web Service桥的支持位于Futures CTP版本中,所以在使用之前,必须保证计算机安装了asp.net ajax 的Futures CTP版本。
学会使用Web Service下(客户端访问)/(服务器端访问)第484张
在网站的Bridges目录下新建一个WeatherForcase.asbx的XML文件,内容如下:
学会使用Web Service下(客户端访问)/(服务器端访问)第2张<?xml version="1.0" encoding="utf-8" ?>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
<bridge namespace="Ruihua" className="WeatherForcast">
学会使用Web Service下(客户端访问)/(服务器端访问)第2张  
<proxy type="Microsoft.Web.Preview.Services.BridgeRestProxy" serviceUrl="http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName"/>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张  
<method name="getWeatherbyCityName">
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    
<input>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张      
<parameter name="theCityName"/>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    
</input>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张  
</method>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
</bridge>

我们来看一下.asbx文件各标签:
(1)<Bridge/>:定义该本地代理的命名空间(namespace属性)和类名(className属性)。这两个属性是代表客户端调用时使用的命名空间及类名,与远程Web Service我关。
(2)<proxy/>:声明该代理的类型,并指定远程Web Service的URL属性。注意这里的URL属性值的构成:.asmx文件的URL加斜杆和要调用的方法名。
(3)<method/>:定义了远程Web Service中要调用的方法名称及参数,注意name属性应与远程Web Service中要调用的方法名称一致。
(4)该标签中通过<parameter/>子标签声明了方法的参数。

有几点需要特别说明一下:
(1)、我在实际使用过程中发现,web Service桥只支持httpGet协议,所以我们需要在Web.config文件中开启HttpGet方式(默认为HttpPost)。在< configuration/><system.web/>下添加如下配置:
    <webServices>
      <protocols>
        <add name="HttpGet"/>
      </protocols>
    </webServices>
(2)如果你使用Futures CTP版本自带的模板新建了一个支持Web Service桥的站点,你需要手动将<buildProviders>节下的<add>元素的extension属性中的 "*"号去掉,这是Fetures CTP的Bug。
(3)一个Web Service桥文件中仅能代理一个方法,如果你需要访问多个方法,则需要新建多个Web Service桥。如你在其中写了多个<proxy>及<method/>,客户端调用时也只会执行最先的那个代理对应的方法。 暂时没还没找到其它好的方法。
(4)不能使用asp.net ajax异步通信层的服务器端至客户端的类型转换功能,因此我们在客户端得到的返回类型只能是string类型,从而加大了进一步进行处理的难度。

   由于存在以上限制,个人感觉使用web Service桥不如使用本地Web Service中转方便,或许是asp.net ajax在这方面还不够成熟吧!

下面是Default.aspx的内容:
学会使用Web Service下(客户端访问)/(服务器端访问)第10张学会使用Web Service下(客户端访问)/(服务器端访问)第11张<%学会使用Web Service下(客户端访问)/(服务器端访问)第12张@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
<html xmlns="http://www.w3.org/1999/xhtml">
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
<head runat="server">
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    
<title>Untitled Page</title>
学会使用Web Service下(客户端访问)/(服务器端访问)第10张学会使用Web Service下(客户端访问)/(服务器端访问)第11张    
<script type="text/javascript">学会使用Web Service下(客户端访问)/(服务器端访问)第12张
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
function btnGetWeather_onclick(sender,args)
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张        
学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张            
var cityName=$get("tbCityName").value;
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张                Ruihua.WeatherForcast.getWeatherbyCityName(
学会使用Web Service下(客户端访问)/(服务器端访问)第12张{"theCityName":cityName},onCompleted,onFailed);
学会使用Web Service下(客户端访问)/(服务器端访问)第19张        }

学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
//异步调用后成功后执行的回调函数
学会使用Web Service下(客户端访问)/(服务器端访问)第16张
        function onCompleted(result)
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张        
学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张            $get(
"result").innerHTML = result;
学会使用Web Service下(客户端访问)/(服务器端访问)第19张        }

学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
学会使用Web Service下(客户端访问)/(服务器端访问)第16张        
//异步调用后失败后执行的回调函数
学会使用Web Service下(客户端访问)/(服务器端访问)第16张
        function onFailed(error)
学会使用Web Service下(客户端访问)/(服务器端访问)第13张学会使用Web Service下(客户端访问)/(服务器端访问)第14张        
学会使用Web Service下(客户端访问)/(服务器端访问)第12张{
学会使用Web Service下(客户端访问)/(服务器端访问)第16张            $get(
"result").innerHTML = error.get_message();
学会使用Web Service下(客户端访问)/(服务器端访问)第19张        }

学会使用Web Service下(客户端访问)/(服务器端访问)第27张    
</script>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
</head>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
<body>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    
<form id="form1" runat="server">
学会使用Web Service下(客户端访问)/(服务器端访问)第2张        
<asp:ScriptManager ID="ScriptManager1" runat="server">
学会使用Web Service下(客户端访问)/(服务器端访问)第2张            
<Services>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张                
<asp:ServiceReference Path="Bridges/WeatherForcase.asbx" />
学会使用Web Service下(客户端访问)/(服务器端访问)第2张            
</Services>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张        
</asp:ScriptManager>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张        
<label id="lblCityName">Please input CityName:</label>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张        
<input id="tbCityName" type="text" />
学会使用Web Service下(客户端访问)/(服务器端访问)第2张        
<input id="btnGetWeather" type="button" value="Get Weather" onclick="return btnGetWeather_onclick()" />
学会使用Web Service下(客户端访问)/(服务器端访问)第2张        
<div id="result"></div>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张    
</form>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
</body>
学会使用Web Service下(客户端访问)/(服务器端访问)第2张
</html>

 以上有两点需要特别注意:
(1)调用远程Web方法的参数的书写方式是采用JSON方式,各个参数需要显式指明参数名和值,并包装为一个JS对象整体传入本地代理方法,这与常规调用方式有所不同。
(2)在ScriptManager中添加的是对Web Service桥文件的引用。

在城市名称中输入"深圳",下面是运行结果:
学会使用Web Service下(客户端访问)/(服务器端访问)第546张

下载本示例
以上内容仅是我个人在学习Web Service的一些认识,如果有疑问,请与我交流!不正确的地方,望多指教!

免责声明:文章转载自《学会使用Web Service下(客户端访问)/(服务器端访问)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇线性支持向量机 (3)hadoop常见错误及解决办法整理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C# Excel导入导出

目录 1. 介绍:描述第三方类库NPOI以及Excel结构 2. Excel导入:介绍C#如何调用NPOI进行Excel导入,包含:流程图、NOPI以及C#代码 3. Excel导出:介绍C#如何调用NPOI进行Excel导出,包含:流程图、NOPI以、C#代码以及代码分析 4. 源码下载:展示运行图及源码下载  1. 介绍 1.1 第三方类库:NPOI...

使用加密的squid配合stunnel实现HTTP代理

现在大部分人都是用ssh tunnel来搭建socks5代理,其实这种方式效率并不高,ssh tunnel并不是为了做代理而存在的。一个比较好的方法是加密squid配合stunnel实现http代理。下面介绍在Archlinux下配置https squid和windows下配置stunnel的方法。 1.首先是Archlinux下安装squid。注意现在...

Ant命令总结

1 Ant是什么? Apache Ant 是一个基于 Java的生成工具。生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式(也有可能转换为可安装的产品映像形式)。随着应用程序的生成过程变得更加复杂,确保在每次生成期间都使用精确相同的生成步骤,同时实现尽可能多的自动化,以便及时产生一致的生成版本2 下载、安装Ant 安装Ant下载.zip...

C# 通过模拟http请求来调用soap、wsdl

C#调用webservice的方法很多,我说的这种通过http请求模拟来调用的方式是为了解决C#调用java的远程API出现各种不兼容问题。 由于远程API不在我们的控制下,我们只能修改本地的调用代码来适应远程API。 在以上情况下,我们就通过模拟http请求来去调用webservice。 首先,我们要分析调用端口时,我们发送出去的数据。 先抓个包看看,这...

ajax()函数传值中文乱码解决方法介绍

jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 复制代码 代码如下: $.ajax({   dataType : ‘json',type : ‘POST',url : ‘http://localhost/test/test.do',data : {id: 1, type: ‘商品'},success : functio...

在ASP.NET 2.0中使用样式、主题和皮肤

ASP.NET 2.0的主题和皮肤特性使你能够把样式和布局信息存放到一组独立的文件中,总称为主题(Theme)。接下来我们可以把这个主题应用到任何站点,用于改变该站点内的页面和控件的外观和感觉。通过改变主题的内容,而不用改变站点的单个页面,就可以轻易地改变站点的样式。主题也可以在开发者之间共享。 ASP.NET包含了大量的用于定制应用程序的页面和控件的外观...