




免费预览已结束,剩余25页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
追雨制作.net/java WebService自学教程V1.0整理/编写:何潮修正:目录1下载后,若有什么不明白的,可联系本人讨论讨论。QQ:26230009332.net建立一个WebService32.1要点说明43.net调用WebService(添加引用的方式)43.1同步与异步调用的方式84.Net采用SOAP调用service94.1不带SoapHeader的Web Service调用9(SOAP 1.1以下是 SOAP 1.2 请求和响应示例。所显示的占位符需替换为实际值。)94.2带SoapHeader的Web Service调用105查看调用WebServices返回的信息体(.Net)136查看请求WebServices的信息体(.Net)137.Net WebServices采用SOAP身份认证(用户名/密码验证)的方式部署与调用137.1部署137.2调用158用axis动态调用WebService 调用类(Java环境)158.1调用类168.2调用方法248.3调用方法2-序列化259参考资料2910若有什么错误欢迎指出2911下载后,若有什么不明白的,可联系本人讨论讨论。QQ:2623000932912若有什么建议和资料也欢迎,告诉我。多谢3013下载后,若有什么不明白的,可联系本人讨论讨论。301 下载后,若有什么不明白的,可联系本人讨论讨论。QQ:2623000932 .net建立一个WebService直接用VS建立一个Web services 的项目,即可。新建后,项目自动有一个,服务了:如下:/ / Service1 的摘要说明 / WebService(Namespace = /) WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1) ToolboxItem(false) public class Service1 : System.Web.Services.WebService WebMethod public string HelloWorld() return Hello World; 2.1 要点说明WebService(Namespace = /)这个命名空间,调用的,与服务上的一致.3 .net调用WebService(添加引用的方式)HelloWorld太简单了,我们调用一下,网络上现有的天气预报服务。天气预报服务:/WebServices/WeatherWebService.asmx/在项目中右键,添加Web引用:/在web 引用名中,可默认也可自定义,下面默认为:.webxml.www//WebServices/WeatherWebService.asmxusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace 天气助手 public partial class Weather : Form public Weather() InitializeComponent(); public string GetWeather(string xCity)/取城市天气 .webxml.www.WeatherWebService mWeatherWebService = new .webxml.www.WeatherWebService(); string WeatherOfCity = mWeatherWebService.getWeatherbyCityName(xCity); return WeatherOfCity; public void Weather_Shown(object sender, EventArgs e)/取支持的省州,放入下拉 try .webxml.www.WeatherWebService mWeatherWebService = new .webxml.www.WeatherWebService(); string mArea = mWeatherWebService.getSupportProvince(); int mCount = mArea.Length - 1; comboBox01.Items.Clear(); for (int mI = 0; mI = mCount; mI+) comboBox01.Items.Add(mAreamI.ToString(); comboBox01.SelectedIndex = 0; catch public void comboBox01_SelectedIndexChanged(object sender, EventArgs e)/取支持的市,放入下拉 try .webxml.www.WeatherWebService mWeatherWebService = new .webxml.www.WeatherWebService(); string mCity = mWeatherWebService.getSupportCity(comboBox01.Text); int mCount = mCity.Length - 1; comboBox02.Items.Clear(); for (int mI = 0; mI = mCount; mI+) comboBox02.Items.Add(mCitymI.Remove(mCitymI.IndexOf(); comboBox02.SelectedIndex = 0; catch public void comboBox02_SelectedIndexChanged(object sender, EventArgs e)/显示 try string WeatherOfCity = GetWeather(comboBox02.ItemscomboBox02.SelectedIndex.ToString(); label03.Text = WeatherOfCity0.ToString(); label05.Text = WeatherOfCity1.ToString(); label06.Text = WeatherOfCity10.ToString(); /今天 pictureBox01.ImageLocation = images/weather/ + WeatherOfCity8.ToString(); pictureBox02.ImageLocation = images/weather/ + WeatherOfCity9.ToString(); label07.Text = WeatherOfCity6.ToString() + WeatherOfCity5.ToString() + WeatherOfCity7.ToString(); label08.Text = WeatherOfCity11.ToString(); /明天 pictureBox03.ImageLocation = images/weather/ + WeatherOfCity15.ToString(); pictureBox04.ImageLocation = images/weather/ + WeatherOfCity16.ToString(); label16.Text = WeatherOfCity13.ToString() + WeatherOfCity12.ToString() + WeatherOfCity14.ToString(); /后天 pictureBox05.ImageLocation = images/weather/ + WeatherOfCity20.ToString(); pictureBox06.ImageLocation = images/weather/ + WeatherOfCity21.ToString(); label17.Text = WeatherOfCity18.ToString() + WeatherOfCity17.ToString() + WeatherOfCity19.ToString(); /城市说明及图片 pictureBox07.ImageLocation = /tqyb/img/city/ + WeatherOfCity3.ToString(); label18.Text = WeatherOfCity22.ToString(); /预计时间 label19.Text = 预报时间: + WeatherOfCity4.ToString(); catch 3.1 同步与异步调用的方式以HelloWorld为例同步:就是要走那个方法。(要等它)异步:调用那个方法,让它自己走。本线程,继续往下走。(不等它)不太懂,可能不是这样理解吧。-webserviceWebMethod public string HelloWorld() return Hello World;异步调用localhost.Service service = new WindowsApp.localhost.Service();service.HelloWorldCompleted += new WindowsApp.localhost.HelloWorldCompletedEventHandler(service_HelloWorldCompleted);/这里是委托一个结束事件 使用回调机制实现异步化处理是功能最强的方式。它允许在Web服务被调用、执行和返回信息期间继续完成它所需要的工作。这时,客户方代码通过在BeginX方法的参数中显式地确定把地址传递到一个Public方法(该方法由委托机制实现),以便在异步化调用完成后可以把结果返回到程序中。 / do Asyn calling here异步调用service.HelloWorldAsync();void service_HelloWorldCompleted(object sender,WindowsApp.localhost.HelloWorldCompletedEventArgs e)同步调用localhost.Service service = new WindowsApp.localhost.Service();4 .Net采用SOAP调用service4.1 不带SoapHeader的Web Service调用(SOAP 1.1以下是 SOAP 1.2 请求和响应示例。所显示的占位符需替换为实际值。) 以最简单的为例HelloWorld:POST /Service1.asmx HTTP/1.1Host: localhostContent-Type: text/xml; charset=utf-8Content-Length: lengthSOAPAction: /HelloWorld (下面的要用所有”,才能运行。这些是为了方便大家比较上图。) /构造soap请求信息 StringBuilder soap = new StringBuilder(); soap.Append(); soap.Append(); soap.Append(); soap.Append( ); /发起请求 Uri uri = new Uri(http:/localhost:2213/Service1.asmx); WebRequest webRequest = WebRequest.Create(uri); webRequest.ContentType = text/xml; charset=utf-8; webRequest.Method = POST; using (Stream requestStream = webRequest.GetRequestStream() byte paramBytes = Encoding.UTF8.GetBytes(soap.ToString(); requestStream.Write(paramBytes, 0, paramBytes.Length); string re=; /响应 WebResponse webResponse = webRequest.GetResponse(); using (StreamReader myStreamReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8) re+= myStreamReader.ReadToEnd(); 4.2 带SoapHeader的Web Service调用using System;using System.IO;using System.Net;using System.Text;namespace ConsoleApplication1class Programstatic void Main(string args)/构造soap请求信息StringBuilder soap = new StringBuilder();soap.Append();soap.Append();soap.Append();soap.Append();/mustUnderstand=1,接收者必须能处理此SoapHeader信息,否则返回错误soap.Append(admin);soap.Append(admin888);soap.Append();soap.Append();soap.Append();soap.Append();soap.Append(dnawo);soap.Append();soap.Append();soap.Append();/发起请求Uri uri = new Uri(http:/localhost:39674/Service1.asmx);WebRequest webRequest = WebRequest.Create(uri);webRequest.ContentType = text/xml; charset=utf-8;webRequest.Method = POST;using (Stream requestStream = webRequest.GetRequestStream()byte paramBytes = Encoding.UTF8.GetBytes(soap.ToString();requestStream.Write(paramBytes, 0, paramBytes.Length);/响应WebResponse webResponse = webRequest.GetResponse();using (StreamReader myStreamReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8)Console.WriteLine(myStreamReader.ReadToEnd();Console.ReadKey();5 查看调用WebServices返回的信息体(.Net)可参考4.1节的内容: /响应 WebResponse webResponse = webRequest.GetResponse(); using (StreamReader myStreamReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8) re+= myStreamReader.ReadToEnd(); 返回的信息应该也是一个结构体信息:类似如下:no6 查看请求WebServices的信息体(.Net)在方法部: HttpContext.Current.Request.SaveAs(E:jj.txt,true);7 .Net WebServices采用SOAP身份认证(用户名/密码验证)的方式部署与调用7.1 部署WebServices为了安全性,不在参数中传递:用户名/密码验证常用方式:采用SOAP身份认证常见的web方法如下(不采用SOAP身份认证): WebMethod public string HelloWorld(string name,string key,string contents) if (/验证是否有权访问 ) return 合法用户; else return 没有权限访问; 采用SOAP身份认证:1:创建Soap头,用验证用户public class MySoapHeader:SoapHeader public MySoapHeader() public string UserName; public string PassWord; public bool ValideUser(string in_UserName, string in_PassWord) if (in_UserName = 1234) & (in_PassWord = 0000) return true; else return false; 2:在WEB方法中应用soappublic MySoapHeader header; /定义用户身份验证类变量headerWebMethod(Description = 用户验证测试) System.Web.Services.Protocols.SoapHeader(header)/用户身份验证的soap头 public string HelloWorld(string contents) /验证是否有权访问 if (header.ValideUser(header.UserName, header.PassWord) return 用户合法; else return 没有权限访问; 7.2 调用1yw.WebService.Service1 test =new 1yw.WebService.Service1();/web引用(改成您自己的) 1yw.MySoapHeader Header = new 1yw.MySoapHeader();/web引用创建soap头对象(改成您自己的) /设置soap头变量 Header.Username = 1234; Header.Password = 0000; test.MySoapHeader = Header; /调用web 方法 string re = test.HelloWorld(dddd);就这样啦8 用axis动态调用WebService 调用类(Java环境)用axis动态调用WebService (Java环境)也就是说用axis开发一个动态调用web服务的客户端怎么用axis发布web服务我就不说了,可以按教程一步步来做。这一半个月主要和tony一起研究如何能动态调用多种框架发布的web服务。后来发现Axis调用CXF服务时,如果返回二维数组会出错。它们两个的标准不一样式- Web_Service开发指南 axis cxf.pdf 下载 地址为:/fileview_161186.html方案1:使CXF定义一个二维的bean,返回list;但客户说,这样太不方便了,以后他们有更新我们几乎也都要走过去更新。方案2:序列化。但这里先看看,一般的动态调用。1,你要下载axis包:下载地址:/fileview_161184.html2,建一个调用类3,调用方法8.1 调用类调用类,如果你也看不懂也没问题,以后再看。复制还是学习第一步(注意:这个类不用修改,也不要修改。当然你高手就可以。)我们关注的是怎么应用它import org.apache.axis.Constants; import org.apache.axis.encoding.ser.SimpleDeserializer; import org.apache.axis.wsdl.gen.Parser; import org.apache.axis.wsdl.symbolTable.*; import javax.wsdl.*; import space.QName; import javax.xml.rpc.Call; import javax.xml.rpc.encoding.Deserializer; import javax.xml.rpc.encoding.DeserializerFactory; import java.util.*; /* * 服务调用的类,现在只限于无复杂类型参数和返回值得情 ,这里参考了网络上得一份开源代码 * * author T-Bag.& neusoftware_20063500 * */ public class ServiceCaller_old private Parser wsdlParser = null; private Map services = null; SuppressWarnings(unchecked) public ServiceCaller_old(String wsdlURL) throws Exception wsdlParser = new Parser(); wsdlParser.run(wsdlURL); / 解析WSDL services = getEntries(ServiceEntry.class);/ 得到服务得入口 /* * 调用服务 * * param serviceName * 服务名 * param portName * 接口名 * param operationName * 操作名 * param parameterValues * 参数 * return 返回值 * throws Exception */ public Map invoke(String serviceName, String portName, String operationName, List parameterValues) throws Exception List inputs = new ArrayList(); String returnName = null; ServiceEntry serviceEntry = (ServiceEntry) services.get(serviceName); Service service = serviceEntry.getService(); org.apache.axis.client.Service clientService = new org.apache.axis.client.Service( wsdlParser, service.getQName();/ 根据解析气和服务得QName,获得服务实例 Call call = clientService.createCall(QName.valueOf(portName), QName .valueOf(operationName);/ 有了服务以后,就根据接口和操作获得调用Call对象 (org.apache.axis.client.Call) call).setTimeout(new Integer(15 * 1000);/ 设置超时时间 BindingEntry bindingEntry = getBindingEntry(serviceName, portName); /利用接口名和服务名 Operation o = getOperation(bindingEntry, operationName); /获得服务器端给出的方法 Parameters parameters = bindingEntry.getParameters(o); /语义上看获得参数 / 执行有返回值 if (parameters.returnParam != null) QName returnQName = parameters.returnParam.getQName(); returnName = returnQName.getLocalPart();/ 结果名 int size = parameters.list.size();/ 遍历所有参数,包括输入和输出 for (int i = 0; i size; i+) Parameter p = (Parameter) parameters.list.get(i); switch (p.getMode() / 判断输入输出类型 case Parameter.IN: inputs.add(getParamData(org.apache.axis.client.Call) call, p, (String) parameterValues.get(i);/ parameterValues是用户得输入(只能输入String) break; case Parameter.OUT: break; case Parameter.INOUT: inputs.add(getParamData(org.apache.axis.client.Call) call, p, (String) parameterValues.get(i); break; Object ret = call.invoke(inputs.toArray();/ 调用服务 Map outputs = call.getOutputParams(); HashMap map = new HashMap(); if (ret != null & returnName != null) map.put(returnName, ret);/ 结果名 - 结果 if (outputs != null) for (Iterator i = outputs.keySet().iterator(); i.hasNext();) Object obj = i.next(); String name; Object value; if (obj.getClass().getName().equals(java.lang.String) name = (String) obj; else name = (QName) obj).getLocalPart(); value = outputs.get(obj); map.put(name, value);/ 具体得结果每个参数 return map; /* * 遍历获得服务名列表 * * return */ public List enumServiceNames() List v = new ArrayList(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 黔南州2024-2025学年度第一学期期末质量监测 物理
- 2024年甘肃省嘉峪关市金川区三年级数学第一学期期末达标检测试题含解析
- 《化工工艺》课件
- 规范乘车安全教育
- 财务共享模式下的审核机制试题及答案
- 2025年污水自动采样器合作协议书
- 看病流程简笔画
- 营销活动管理控制体系
- 甘肃省部分学校2024-2025学年高一下学期期中联考地理试卷(含答案)
- Unit 6(单元测试)-2024-2025学年八年级英语下册 人教版
- Copley驱动器用户指南
- 生物有机肥生产技术可行性分析报告
- 供水管网巡查管理制度
- 工程设计资质专业人员专业对照表
- 胸痛中心培训课件胸痛中心的时钟统一及时间管理胸痛中心时间节点管理要求
- 中医外科学皮肤及性传播疾病课件
- 《风扇及其系统设计》
- 孕期艾滋病检测及服务流程
- 明渠均匀流计算公式
- 校园超市经营投标方案(完整技术标)
- GB/T 9126.1-2023管法兰用非金属平垫片第1部分:PN系列
评论
0/150
提交评论