C#下的webservcie 实现代码和 在vc和python下的调用实现

web

C#下的webservcie 实现代码,很简单一看就清楚了是完成什么样的功能了

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;

namespace WebHelloZ5
{
/// <summary>
/// Service1 的摘要说明。
/// </summary>
public class Service1 : System.Web.Services.WebService
{
public Service1()
{
//CODEGEN:该调用是 ASP.NET Web 服务设计器所必需的
InitializeComponent();
}

#region Component Designer generated code

//Web 服务设计器所必需的
private IContainer components = null;

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if(disposing && components != null)
{
components.Dispose();
}
base.Dispose(disposing);
}

#endregion

// WEB 服务示例
// HelloWorld() 示例服务返回字符串 Hello World
// 若要生成,请取消注释下列行,然后保存并生成项目
// 若要测试此 Web 服务,请按 F5 键

//[WebMethod]
//public string HelloWorld1()
//{
// return "Hello World";
//}

[WebMethod]
public string HelloWorld(int nArg, string strArg)
{
return strArg+ nArg.ToString();
}

}
}

下面就是调用webservice时,网络上大家发送的数据包了

Client请求数据:

POST /WebHelloZ5/Service1.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml
Content-Length: length
SOAPAction: "http://tempuri.org/HelloWorld"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<HelloWorld xmlns="http://tempuri.org/">
<nArg>int</nArg>
<strArg>string</strArg>
</HelloWorld>
</soap:Body>
</soap:Envelope>

Server回应数据:

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<HelloWorldResponse xmlns="http://tempuri.org/">
<HelloWorldResult>string</HelloWorldResult>
</HelloWorldResponse>
</soap:Body>
</soap:Envelope>

VC7下的自动生成的代理类,如下所示:

template <typename TClient>
inline HRESULT CService1T<TClient>::HelloWorld(
int nArg,
BSTR strArg,
BSTR* HelloWorldResult
)
{
HRESULT __atlsoap_hr = InitializeSOAP(NULL);
if (FAILED(__atlsoap_hr))
{
SetClientError(SOAPCLIENT_INITIALIZE_ERROR);
return __atlsoap_hr;
}

CleanupClient();

CComPtr<IStream> __atlsoap_spReadStream;
__CService1_HelloWorld_struct __params;
memset(&__params, 0x00, sizeof(__params));
__params.nArg = nArg;
__params.strArg = strArg;

__atlsoap_hr = SetClientStruct(&__params, 0);
if (FAILED(__atlsoap_hr))
{
SetClientError(SOAPCLIENT_OUTOFMEMORY);
goto __skip_cleanup;
}

__atlsoap_hr = GenerateResponse(GetWriteStream());
if (FAILED(__atlsoap_hr))
{
SetClientError(SOAPCLIENT_GENERATE_ERROR);
goto __skip_cleanup;
}

__atlsoap_hr = SendRequest(_T("SOAPAction: \"http://tempuri.org/HelloWorld\"\r\n"));
if (FAILED(__atlsoap_hr))
{
goto __skip_cleanup;
}
__atlsoap_hr = GetReadStream(&__atlsoap_spReadStream);
if (FAILED(__atlsoap_hr))
{
SetClientError(SOAPCLIENT_READ_ERROR);
goto __skip_cleanup;
}

// cleanup any in/out-params and out-headers from previous calls
Cleanup();
__atlsoap_hr = BeginParse(__atlsoap_spReadStream);
if (FAILED(__atlsoap_hr))
{
SetClientError(SOAPCLIENT_PARSE_ERROR);
goto __cleanup;
}

*HelloWorldResult = __params.HelloWorldResult;
goto __skip_cleanup;

__cleanup:
Cleanup();
__skip_cleanup:
ResetClientState(true);
memset(&__params, 0x00, sizeof(__params));
return __atlsoap_hr;
}

流程为:

1 初始化参数列表( SetClientStruct(&__params, 0);)
|
V

2.生成发送数据请求(GenerateResponse(GetWriteStream());SendRequest(_T("SOAPAction: \"http://tempuri.org/HelloWorld\"\r\n"));)
|
V
3.接收和解析回应数据(BeginParse(__atlsoap_spReadStream);)
|
V
4.清理工作

Python代码:

#author:zfive5(zhaozidong)
#email: zfive5@yahoo.com.cn

import httplib
import xml.parsers.expat
import urlparse

class ZFive5Web:

def __init__(self, url,xmlns):
self.url=url
self.xmlns=xmlns
self.ret=""
self.data=""

def gen_request(self,strfunc,strxmlns,dictarg):
ret="<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">"
ret+="<soap:Body>"
ret+="<%s xmlns=\"%s/\">"%(strfunc,strxmlns)
for (k,v) in dictarg.items():
if k is int:
ret+="<%s>%s</%s>"%(k,str(v),k)
else:
ret+="<%s>%s</%s>"%(k,v,k)
ret+="</%s>"%(strfunc)
ret+="</soap:Body>"
ret+="</soap:Envelope>"
return ret

def hello_world(self,argl):
func="HelloWorld"
addr=urlparse.urlparse(self.url)
argd={}
argd["nArg"]=argl[0]
argd["strArg"]=argl[1]

try:
header={}
header['Host']='localhost'
header['Content-Type']='text/xml'
header['SOAPAction']='\"%s/%s\"'%(self.xmlns,func)
conn=httplib.HTTPConnection(addr[1])
print self.gen_request(func,self.xmlns,argd)
conn.request('POST','/WebHelloZ5/Service1.asmx',self.gen_request(func,self.xmlns,argd),header)
resp=conn.getresponse()
dataxml=resp.read()
def start_element(name, attrs):
pass

def end_element(name):
if name=='HelloWorldResult':
self.ret=self.data
#elif name=='OurPutArg':
# argl[0]=self.temp

def char_data(data):
self.data=data

pxml=xml.parsers.expat.ParserCreate()
pxml.StartElementHandler = start_element
pxml.EndElementHandler = end_element
pxml.CharacterDataHandler = char_data
pxml.Parse(dataxml, 1)
except:
return None
return self.ret

def test():
A=ZFive5Web("http://127.0.0.1/WebHelloZ5/Service1.asmx","http://tempuri.org")
l=[1,'121']
ret=A.hello_world([1,'121'])

if __name__ == '__main__':
assert test()

流程与上差不多如果实现分析.asmx?WDSL文件就完全可以vs中的添加web引用的功能,这里
剩下的主要是特殊符号的处理和类型转化工作。

时间: 2024-08-04 08:46:40

C#下的webservcie 实现代码和 在vc和python下的调用实现的相关文章

javascript-麻烦看下这段JQ代码,有一些困惑

问题描述 麻烦看下这段JQ代码,有一些困惑 $(function(){ var myScroll2=null; function menuInit(){ var _menuScroll = $("".menuScroll""); var _menuScroll_size = _menuScroll.find(""li"").length;//获取 li长度 var liWidth = 0; $("".men

ASP实现上一篇,下一篇过程代码

ASP实现上一篇,下一篇过程代码 Rem==上一篇== Rem====================================================== Rem= 参数说明: Rem= pid当前ID,prame:栏目前辍(如一般web_news表,字段时一般为wn_**,prame就代表wn) Rem= ptable(表前辍.如一般表名是:站点名_表名(shenzhe_news) ptable:就代表shenzhe) Rem= 说明:采用上面命名法,可使该过程达到通用 Rem

纯CSS实现超简单的二级下拉导航菜单代码

本文实例讲述了纯CSS实现超简单的二级下拉导航菜单代码.分享给大家供大家参考.具体如下: 这是一款纯CSS菜单,二级下拉导航效果,是最简洁的CSS导航菜单,兼容性也很棒,IE7/8.火狐等都支持,而且它还是学习CSS菜单编写的典型教程,让你学会很多CSS技巧. 运行效果截图如下: 具体代码如下:   复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.

ios系统下删除文件的代码

  本文给大家总结了几则在IOS系统下删除文件的代码,十分的实用,有需要的小伙伴可以参考下. 方法一:这段objective c代码用于删除指定路径的文件 ? 1 2 3 if ([fileManager removeItemAtPath:@"FilePath" error:NULL]) { NSLog(@"Removed successfully"); } 方法二: ? 1 2 3 4 5 NSFileManager *defaultManager; defaul

Ruby连接使用windows下sql server数据库代码实例

  这篇文章主要介绍了Ruby连接使用windows下sql server数据库代码实例,本文直接给出实现代码,而且给出了两种实现和access数据库的实现代码,需要的朋友可以参考下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 req

jquery取消选择select下拉框示例代码

 本篇文章主要是对jquery取消选择select下拉框示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 有三个select下拉框 一个大类,两个小类隐藏,需要在选择大类的时候,小类显示同时清除另外的小类选择的项 这需求有点儿..........   下面是三个select:   代码如下: <select name="pWaqqqy" id="sel_type" onchange="selectFunction()">

iOS开发之UITableView与UISearchController实现搜索及上拉加载,下拉刷新实例代码_IOS

废话不多说了,直接给大家贴代码了. 具体代码如下所示: #import "ViewController.h" #import "TuanGouModel.h" #import "TuanGouTableViewCell.h" #define kDeviceWidth [UIScreen mainScreen].bounds.size.width #define kDeviceHeight [UIScreen mainScreen].bounds.

java代码-望大神帮分析下,最好是把该代码的思路给分析讲解下,虽没有分但万分感谢!

问题描述 望大神帮分析下,最好是把该代码的思路给分析讲解下,虽没有分但万分感谢! import java.math.BigDecimal; public class NumToRMB { public static void main(String[] args) { System.out.println(changeToBig(Double.parseDouble(args[0]))); } public static String changeToBig(double value) { ch

对象-java 抽象类有段代码没看懂!!!帮忙解释下

问题描述 java 抽象类有段代码没看懂!!!帮忙解释下 自己看视频自学到网络编程,发现下边的代码看不懂,自己也百度了很多,还是没理解好抽象类 OutputStream os=Socket.getOutputSteam(); os.write("加油".getBytes()): 这段代码没看懂,OutputStream抽象类不能直接创建对象,也没有子类去实现,为什么可以直接调用write(byte[] b) 方法? 解决方案 不能创建对象的意思是不能通过new outputstream