http://hi.baidu.com/654085966/item/53ee8c0f108ad78202ce1b1d   -----------转自

客户端调用Web Service的方式我现在知道的有三种,分别为Http_Get,Http_Post和通过代理类来调用
直接通过HTTP-GET和直接通过HTTP-POST来请求访问Web服务是非常底层的且麻烦,(详细用法请查看C#分类中的说明),还有一种就是通过代理类来访问,DoNet框架提供的WSDL.EXE可以产生要求的代理类. 在.net命令里输入wsdl http//url/xxx.asmx /language:cs /out:xxx.ss /protocol:httpGet即可生成HttpGet的代理类 首先我将列出WebService的原代码: using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
using System.Data.SqlClient; namespace Play.CH1
{
public class Service1 : System.Web.Services.WebService
{
public Service1()
{
InitializeComponent();
} private System.Data.SqlClient.SqlConnection sqlConnection1; private IContainer components = null; private void InitializeComponent()
{
this.sqlConnection1 = new System.Data.SqlClient.SqlConnection(); this.sqlConnection1.ConnectionString = "workstation id=\"192.168.1.9\";packet size=4096;user id=sa;data source=\"192.168.1.9\";pe" +
"rsist security info=True;initial catalog=pubs;password=";
this.sqlConnection1.InfoMessage += new System.Data.SqlClient.SqlInfoMessageEventHandler(this.sqlConnection1_InfoMessage); }
protected override void Dispose( bool disposing )
{
if(disposing && components != null)
{
components.Dispose();
}
base.Dispose(disposing);
} private void sqlConnection1_InfoMessage(object sender, System.Data.SqlClient.SqlInfoMessageEventArgs e)
{ } [WebMethod]
public string doSearch(string keyword)
{
SqlDataAdapter da = new SqlDataAdapter("select top 20 title_id,title from titles where title like @title",sqlConnection1);
da.SelectCommand.Parameters.Add(new SqlParameter("@title","%"+keyword+"%"));
DataSet ds=new DataSet();
da.Fill(ds);
return ds.GetXml();
} }
} 再贴出刚生所生成的代理类的原代码
//------------------------------------------------------------------------------
// <autogenerated>
// This code was generated by a tool.
// Runtime Version: 1.1.4322.573
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </autogenerated>
//------------------------------------------------------------------------------ //
// 這個原始程式碼是由 wsdl,Version=1.1.4322.573 自動產生。
//
using System.Diagnostics;
using System.Xml.Serialization;
using System;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.Web.Services; /// <remarks/>
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public class Service1 : System.Web.Services.Protocols.HttpGetClientProtocol { public Service1() {
this.Url = "http://localhost/Play/CH1/Service1.asmx";
} [System.Web.Services.Protocols.HttpMethodAttribute(typeof(System.Web.Services.Protocols.XmlReturnReader), typeof(System.Web.Services.Protocols.UrlParameterWriter))]
[return: System.Xml.Serialization.XmlRootAttribute("string", Namespace="http://tempuri.org/", IsNullable=true)]
public string doSearch(string keyword) {
return ((string)(this.Invoke("doSearch", (this.Url + "/doSearch"), new object[] {
keyword})));
} public System.IAsyncResult BegindoSearch(string keyword, System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("doSearch", (this.Url + "/doSearch"), new object[] {
keyword}, callback, asyncState);
} public string EnddoSearch(System.IAsyncResult asyncResult) {
return ((string)(this.EndInvoke(asyncResult)));
}
} 再来对代理类进行详细说明 . 代理类开始是引出一系列的命名空间,代码的主题是定义一个跟待访问的Web服务类同名的 从System.Web.Services.Protocols.HttpGetClientProtocol派生的代理类
. 代理类具有如下四个方法
2.1 不带参数的构造函数
构造函数主要是设定代理类的URL属性,这个属性表示WEB服务的URL.
2.2 doSearch方法
该方法是WEB服务的doSearch方法的本地代理版本,该方法被一个HttpMethodAttribute所标注,其目的是指示如何序列化发送到WEB服务的doSearch方法的参数以及如何反序列化WEB服务的响应.如果采用HTTP-GET调用WEB服务的方法,则必须把HTTPMothodAttribute的ReturnFormatter属性设置为XmlReturnReader,ParameterFormatter属性设置为UrlParameterWriter. 方法的返回值也被一个XmlRootAttribute特性所标记.该特性用以将类,结构,枚举或结口标记为XML文档实例的根(或项级)元素.该特性的ElementName属性表示返回值对应的XML元素的名称,Namespace属性表示XML根元素的命名空间,IsNullable属性表示返回值为空时ElementName所指的无素是否包xsi:nil属性.
以上特性其实代替了我在C#分类中所讲的利用HTTP-GGET;HTTP-POST来获得WEB服务中的设置URL,在URL中附中参数,以及从返回XML文档中提结果的大段代码
再来看看方法中的代码
return ((string)(this.Invoke("doSearch", (this.Url + "/doSearch"), new object[] { keyword})));
上述代码先调用一个Invoke方法,(该方法继承自父类HttpGetClientProtocol),然后把调用结果强制转化为字符串类型.
Invoke方法的原型:
protected Object Invoke(string MethodName,string RequestUrl,Object[] Parameters);
参数:MethodName->表示要调用的Web服务的名称,本例中的“doSearch“
参数:RequestUrl->表示WEB服务的方法的URL,它是由WEB服务的URL加上"/方法名"组成
参数:Parameters->是一个对象数组,包含要传递到远程WEB服务的参数,数组中的顺序与派生类的调用方法中的参数顺序对应
返回值包含派生类方法的返回值和所有引用或输出参数的对象数组
2.3 BegindoSearch方法
这个方法用以启动对WEB服务的doSearch方法的异步调用
BegindoSearch的参数:
keyword: 参数.
callback: AsyncCallback类型的委托对象,当异步调用结束后,callback所代表的函数将被回调,用来接收结果.
AsyncCallback委托原型:
[Serializable]
public delegate void AsyncCallback(IAsyncResult ar);
其: IAsyncResult接口:用于监视和管理异步操作.
IAsyncResult接口的原型
public interface IAsyncResult
{
object AsyncState{get;}//返回被作为最后一个参数提供的对象
WaitHandle AsyncWaitHandle{get;}//返回WaitHandle,它可用于执行WaitHandle.WaitOne,WaitAny,WaitAll,以实现同步
bool CompletedSynchronously{get;}//如果开始操作同步完成,则CompletedSynchronously=true
bool IsCompleted{get;}//在服务器完成调用处理后IsCompleted=true
} 2.4 EnddoSearch方法
这个方法用以结束异步调用,并获得调用结果

.net 代理类(WebService代理类的详解 )的更多相关文章

  1. JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解

    在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...

  2. CSS中伪类及伪元素用法详解

    CSS中伪类及伪元素用法详解   伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...

  3. Nginx 反向代理工作原理简介与配置详解

    Nginx反向代理工作原理简介与配置详解   by:授客  QQ:1033553122   测试环境 CentOS 6.5-x86_64 nginx-1.10.0 下载地址:http://nginx. ...

  4. StringUtils类API及使用方法详解

    StringUtils类API及使用方法详解 StringUtils方法概览 判空函数 1)StringUtils.isEmpty(String str) 2)StringUtils.isNotEmp ...

  5. 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解

    PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...

  6. Object类、包装类、内部类详解

    1.Object类 1.概念: 1.1 所有类在创建时都默认继承了java.lang.Object 1.2 所有类对象都可以声明为类对象的引用 Object ob1=new String(); Obj ...

  7. Kotlin——从无到有系列之中级篇(四):面向对象的特征与类(class)继承详解

    如果您对Kotlin很有兴趣,或者很想学好这门语言,可以关注我的掘金,或者进入我的QQ群大家一起学习.进步. 欢迎各位大佬进群共同研究.探索 QQ群号:497071402 进入正题 在前面的章节中,详 ...

  8. [Java]Java类和对象内存分配详解

    描述 代码说明: 一.当Person p1 = new Person();第一次被调用时需要做两件事: 1.先判断类加载器是否加载过Person类,如果没有则加载到Person类型到方法区 2.在堆中 ...

  9. 类的命名空间与卸载详解及jvisualvm使用

    类的命名空间详解: 在上一次[https://www.cnblogs.com/webor2006/p/9108301.html]最后实验中有一个违背咱们理解的,这里回顾一下: 也就是说,"某 ...

  10. java中ReentrantLock类的详细介绍(详解)

    博主如果看到请联系小白,小白记不清地址了 简介 ReentrantLock是一个可重入且独占式的锁,它具有与使用synchronized监视器锁相同的基本行为和语义,但与synchronized关键字 ...

随机推荐

  1. 将控制台信息重新导向到JTextArea

    package com.function; import java.io.FileOutputStream; import java.io.IOException; import java.io.Ou ...

  2. django-media隐射

    需要再主url.py中设置 from django.urls import include, path from django.conf.urls.static import static from ...

  3. 【Python爬虫实战】Scrapy框架的安装 搬运工亲测有效

    windows下亲测有效 http://blog.csdn.net/liuweiyuxiang/article/details/68929999这个我们只是正确操作步骤详解的搬运工

  4. 【转】AD常用端口

    通常在域环境中我们有部分设备在DMZ区时,就需要知道AD的相关端口.在此提供给各位: 用户登录与验证身份时会用到的连接端口用户登录时会用到以下的服务,因此如果用户的计算机与域控制器之间被防火墙隔开,就 ...

  5. 错误代码: 1231 - Variable 'sql_mode' can't be set to the value of 'NULL'

    错误代码: 1231 - Variable 'sql_mode' can't be set to the value of 'NULL' 错误代码: - Variable 'sql_mode' can ...

  6. leetcode218

    from heapq import * class Solution: def getSkyline(self, LRH): skyline = [] i, n = 0, len(LRH) liveH ...

  7. Mp4 to Img

    # -*- coding: utf-8 -*- """ Created on Thu May 3 16:51:50 2018 """ # 录 ...

  8. django 认证模块auth,表单组件form

    django认证系统(auth): 1.首先我们在新窗口中打开一个django项目,之后点击,

  9. Git实用教程

    http://iissnan.com/progit/html/zh/ch2_2.html

  10. vector 内存释放相关

    在使用vector 存储char 类型时 new的数据 在vecto 执行rerase的时候或者 单项执行clear 内存是不能被释放的. 比如有下面的一个测试: class SnapshotInfo ...