winform中对webservice的调用
- 格式:docx
- 大小:24.03 KB
- 文档页数:4
一般情况下winform调用webservice时步骤1添加服务引用---高级----添加web引用------填写url--添加web引用即可完成对webservice的引用让环境来为我们生成服务代理,然后调用对应的Web服务。
如果需要动态调用WebService,要实现这样的功能:publicstaticobjectInvokeWebService(stringurl, stringmethodname,objec t[] args)其中,url是Web服务的地址,methodname是要调用服务方法名,args是要调用Web服务所需的参数,返回值就是web服务返回的结果了。
要实现这样的功能,你需要这几个方面的技能:反射、CodeDom、编程使用C#编译器、WebService。
在了解这些知识后,就可以容易的实现web服务的动态调用了:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using ;using System.CodeDom;using piler;using System.Web.Services.Description;using Microsoft.CSharp;namespace NetbankTMP{public static class WebServiceHelper{/// <summary>/// 动态调用WebService/// </summary>/// <param name="url">WebService地址</param>/// <param name="methodname">方法名(模块名)</param>/// <param name="args">参数列表,无参数为null</param>/// <returns>object</returns>public static object InvokeWebService(string url, string methodname, object[] args){return InvokeWebService(url, null, methodname, args);}/// <summary>/// 动态调用WebService/// </summary>/// <param name="url">WebService地址</param>/// <param name="classname">类名</param>/// <param name="methodname">方法名(模块名)</param>/// <param name="args">参数列表</param>/// <returns>object</returns>public static object InvokeWebService(string url, string classname, string methodname, object[] args){string @namespace ="bank.WebService.webservice";if (classname == null || classname == ""){classname = WebServiceHelper.GetClassName(url);}//获取服务描述语言(WSDL)WebClient wc = new WebClient();Stream stream = wc.OpenRead(url+"?WSDL");//【1】ServiceDescription sd = ServiceDescription.Read(stream);//【2】ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();//【3】sdi.AddServiceDescription(sd, "", "");CodeNamespace cn = new CodeNamespace(@namespace);//【4】 //生成客户端代理类代码CodeCompileUnit ccu = new CodeCompileUnit();//【5】spaces.Add(cn);sdi.Import(cn, ccu);CSharpCodeProvider csc = new CSharpCodeProvider();//【6】 ICodeCompiler icc = csc.CreateCompiler();//【7】//设定编译器的参数CompilerParameters cplist = new CompilerParameters();//【8】cplist.GenerateExecutable = false;cplist.GenerateInMemory = true;cplist.ReferencedAssemblies.Add("System.dll");cplist.ReferencedAssemblies.Add("System.XML.dll");cplist.ReferencedAssemblies.Add("System.Web.Services.dll ");cplist.ReferencedAssemblies.Add("System.Data.dll");//编译代理类CompilerResults cr = pileAssemblyFromDom(cplist, ccu);//【9】if (true == cr.Errors.HasErrors){System.Text.StringBuilder sb = new StringBuilder();foreach (CompilerError ce in cr.Errors){sb.Append(ce.ToString());sb.Append(System.Environment.NewLine);}throw new Exception(sb.ToString());}//生成代理实例,并调用方法System.Reflection.Assembly assembly =piledAssembly;Type t = assembly.GetType(@namespace+"."+ classname, true, true);object bj = Activator.CreateInstance(t);//【10】System.Reflection.MethodInfo mi =t.GetMethod(methodname);//【11】return mi.Invoke(obj, args);}private static string GetClassName(string url){//假如URL为"http://localhost/InvokeService/Service1.asmx"//最终的返回值为 Service1string[] parts = url.Split('/');string[] pps = parts[parts.Length - 1].Split('.');return pps[0];}}}上面的注释已经很好的说明了各代码段的功能,下面给个例子看看,这个例子是通过访问/globalweather.asmx服务来获取各大城市的天气状况。
调用Web Service的方法1. 简介是一种面向对象的编程语言,用于开发Windows应用程序和Web应用程序。
通过,我们可以轻松地调用Web Service,实现与远程服务器进行通信并获取数据的功能。
本文将详细介绍如何在中调用Web Service的方法。
2. 准备工作在开始之前,我们需要确保以下几点:•安装Visual Studio:确保已安装最新版本的Visual Studio开发环境。
•Web Service URL:获得要调用的Web Service的URL地址。
3. 创建项目首先,我们需要创建一个新的项目。
按照以下步骤进行操作:1.打开Visual Studio,并选择“创建新项目”。
2.在“新建项目”对话框中,选择“Visual Basic”和“Windows桌面”。
3.选择“Windows桌面应用程序”模板,并为项目命名。
4.单击“确定”按钮创建项目。
4. 添加Web Service引用在项目中调用Web Service之前,我们需要添加对Web Service的引用。
按照以下步骤进行操作:1.在“解决方案资源管理器”窗口中,右键单击项目,然后选择“添加”->“服务引用”。
2.在“服务引用”对话框中,单击“高级”按钮。
3.在“高级设置”对话框中,单击“添加Web引用”按钮。
4.在“添加引用”对话框中,输入Web Service的URL地址,然后单击“添加引用”按钮。
5.等待一段时间,直到引用被成功添加到项目中。
5. 调用Web Service方法一旦Web Service引用被添加到项目中,我们就可以开始调用WebService的方法了。
按照以下步骤进行操作:1.在代码中,实例化Web Service的代理类。
代理类的名称通常以“服务名称+SoapClient”结尾。
Dim service As New WebServiceName.WebServiceNameSoapClient()2.调用Web Service的方法,使用代理类的实例。
delphi调⽤C#写的webservice看以下的⼀个例⼦(转)先⽤创建⼀个简单的webservices;1.打开2003 新建⼀个webservises 命名为WebService12.添加两个WebMethod[WebMethod]public string HelloWorld(){return"Hello World ⽤.NET写的web服务!!^_^ ";}[WebMethod]public string datetostr(DateTime dt)//将时间转换为字符{return dt.ToUniversalTime().ToString();} 完整代码using System;using System.Collections;using ponentModel;using System.Data;using System.Diagnostics;using System.Web;using System.Web.Services;namespace WebService1{public class Service1 : System.Web.Services.WebService{public Service1(){//CODEGEN: 该调⽤是 Web 服务设计器所必需的InitializeComponent();}#region组件设计器⽣成的代码//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[WebMethod]public string HelloWorld(){return"Hello World ⽤.NET写的web服务!!^_^ ";}[WebMethod]public string datetostr(DateTime dt)//将时间转换为字符{return dt.ToUniversalTime().ToString();}}}1下⾯在打开delphi 72新建⼀个应⽤程序:拖两个button两个edit 和⼀个HTTPRIO(在webservices页上)到窗体上;3.接下来:File-> new-> other-> webservices-> WSDL importer点击next 导⼊保存unit Service14.在unit1(form1 的单元⽂件)中引⽤Service1, XSBuiltIns5. HTTPRIO1的(特别注意)。
几种调用WebService的方法 更新日期:2005-07-12 06:10 出处: 作者:阿炳1.在JavaScript中调用WebService<script language="javascript">function PostRequestData(URL,data){var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");xmlhttp.Open("POST",URL, false);xmlhttp.SetRequestHeader ("Content-Type","text/xml; charset=utf-8"); xmlhttp.SetRequestHeader ("SOAPAction","/myService/test/isNumner");try {xmlhttp.Send(data);var result = xmlhttp.status;}catch(ex) {return("0" + ex.description + "|" + ex.number);}if(result==200) {return("1" + xmlhttp.responseText);}xmlhttp = null;}function loadit(value){var url = ’http://localhost/myService/test.asmx’;var data ;var r;data = ’<?xml version="1.0" encoding="utf-8"?>’;data = data + ’<soap:Envelope xmlns:xsi="/2001/XMLSchema-instance" xmlns:xsd= "/2001/XMLSchema" xmlns:soap="/soap/envelope/">’;data = data + ’<soap:Body>’;data = data + ’<isNumner xmlns="/myService/test">’;data = data + ’<str>’+value+’</str>’;data = data + ’</isNumner>’;data = data + ’</soap:Body>’;data = data + ’</soap:Envelope>’;r=PostR equestData(url,data);document.write(r);}loadit(’5’);</script>还可以使用微软的htc组件来实现,可以到这里下载:/workshop/author/webservice/webservice.htc<script language="javascript">function timer(){eService("http://localhost/myService/test.asmx?WSDL","test");service.test.callService(callback,"isNumner",’gdh’);}function callback(res){if (!res.error)time.innerText=res.value;}</script><div id="service" style="behavior:url(webservice.htc)"></div><span id="time"></span>2. 在Asp中<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%><%Dim strxmlDim str’定义soap消息strxml = "<?xml version=’1.0’encoding=’tf-8’?>"strxml = strxml & "<soap:Envelope xmlns:xsi=’/2001/XMLSchema-instance’ xmlns:xs d=’/2001/XMLSchema’xmlns:soap=’/soap/envelope/’>"strxml = strxml & "<soap:Body> "strxml = strxml & "<isNumner xmlns=’/myService/test’>"strxml = strxml & "<str>4</str>"strxml = strxml & "</isNumner>"strxml = strxml & "</soap:Body>"strxml = strxml & "</soap:Envelope>"’定义一个XML的文档对象,将手写的或者接受的XML内容转换成XML对象’set x = createobject("Microsoft.DOMDocument")’初始化XML对象’将手写的SOAP字符串转换为XML对象’ x.loadXML strxml’初始化http对象Set h = createobject( "Microsoft.XMLHTTP")’向指定的URL发送Post消息h.open "POST", "http://localhost/myService/test.asmx", Falseh.setRequestHeader "Content-Type", "text/xml"h.setRequestHeader "SOAPAction", "/myService/test/isNumner"h.send (strxml)While h.readyState <> 4Wend’显示返回的XML信息str = h.responseText’将返回的XML信息解析并且显示返回值’Set x = createobject("MSXML2.DOMDocument")’ x.loadXML str’str = x.childNodes(1).Textresponse.write(str)%>3.在.net中在.net中调用WebService就方便多了,没有必要自己写soap消息了,以上都是用XMLHTTP来发送WebService请求的,在.net只要添加了web引用,会自动为你创建一个代理类。
C#调⽤WebService的⽅法介绍⼀、前⾔在⽇常⼯作中,如果涉及到与第三⽅进⾏接⼝对接,有的会使⽤WebService的⽅式,这篇⽂章主要讲解在.NET Framework中如何调⽤WebService。
⾸先我们创建⼀个WebService,⾥⾯有两个⽅法:⼀个⽆参的⽅法,⼀个有参的⽅法:创建好了WebService以后,把WebService部署到IIS上,并确保可以访问⼆、静态引⽤这种⽅式是通过添加静态引⽤的⽅式调⽤WebService。
⾸先创建⼀个Winform程序,界⾯上有⼀个按钮,点击按钮调⽤WebService:然后添加静态引⽤。
在要调⽤WebService的项⽬上选择引⽤,然后右键选择“添加服务引⽤”,如下图所⽰:然后输⼊IIS上部署的WebService地址:最后点击“确定”按钮即可完成静态引⽤WebService,添加完成以后的项⽬结构如下图所⽰:添加完引⽤以后,就可以编写代码了:/// <summary>/// 静态调⽤WebService/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_Static_Click(object sender, EventArgs e){// 实例化类CallWebService.TestWebSoapClient client = new CallWebService.TestWebSoapClient();// 调⽤⽆参的HelloWorld⽅法string value1= client.HelloWorld();// 调⽤有参的⽅法string value2 = client.Test("有参⽅法");// 输出MessageBox.Show($"⽆参⽅法返回值:{value1},有参⽅法返回值:{value2}");}运⾏程序测试:这样就可以实现调⽤WebService了。
随着互联网的普及和发展,Web服务器的应用越来越广泛,而在.NET 开发中,调用Web服务器是非常常见的操作。
本文将详细介绍在.NET开发中调用Web服务器的方法。
1. 使用HttpWebRequest和HttpWebResponse类在.NET开发中,可以使用HttpWebRequest和HttpWebResponse 类来实现与Web服务器的交互。
HttpWebRequest类用于创建一个HTTP请求,HttpWebResponse类用于获取服务器的响应。
通过这两个类,可以实现与Web服务器的通信。
以下是一个简单的示例代码:```csharp// 创建一个HttpWebRequest对象HttpWebRequest request =(HttpWebRequest)WebRequest.Create("网络协议xxx");// 设置请求的方法为GETrequest.Method = "GET";// 获取服务器的响应HttpWebResponse response =(HttpWebResponse)request.GetResponse();Stream stream = response.GetResponseStream(); StreamReader reader = new StreamReader(stream);string responseContent = reader.ReadToEnd();```通过上面的代码,可以实现与Web服务器的简单交互。
在实际开发中,还可以根据需要设置请求的其他参数,如请求头、请求体等。
2. 使用HttpClient类在.NET Framework 4.5及以上版本中引入了HttpClient类,它提供了更加灵活和方便的方式与Web服务器进行交互。
HttpClient类使用起来更加简洁,以下是一个简单的示例代码:```csharp// 创建一个HttpClient对象HttpClient client = new HttpClient();// 向服务器发送一个GET请求HttpResponseMessage response = aw本人t client.GetAsync("网络协议xxx");string responseContent = aw本人tresponse.Content.ReadAsStringAsync();```通过HttpClient类,可以方便地实现与Web服务器的交互。
在没有安装IIS的情况下使用vc#和VWD实现WEBservice的实验“今天写一个webservice的具体实现过程,所用编辑器都是微软的免费Express版。
而且没有用IIS。
webservice的应用分:服务器端和客户端在做webservice的时候必须使用IIS服务器运行服务端,才能在客户端对其进行调用,但是XP默认情况下是没有安装IIS的,我们现在假设在我们的服务器端放了一个加法程序,在客户端是一个winForm程序来调用这个webService,这仅仅是一个练习,我们没有必要再去安装IIS,我们可以巧妙的运用以下手段达到webservice的练习:使用Microsoft Visual Web Developer 2005 Express Edition(简称VWD)做网页,调试的时候系统会启动一个轻量级的web服务器(叫 development server,用过WEB MARTRIX的同志是最早见到这个东东的),它会显示当前页面的URL和端口号(随机分配).我们简称它为ADS。
1.打开VWD, Web Service---存为: "d:\soa"---ok这时会自动定位到Service.cs文件中,注意还有一个自动建立的对应文件"Service.asmx"为了区别我们新建一个新的文件:2.右键单击"solution Explorer"中的"d:\soa"---"Add new item"此步骤可以使用"Ctrl+shift+a"快捷键来完成3.选择"web service" ---命名为"myTest.asmx"---勾选"Place code in separate file"---Add4.将下列代码替换到"myTest.cs"中:using System;using System.Web;using System.Collections;using System.Web.Services;using System.Web.Services.Protocols;///<summary>/// Summary description for myTest///</summary>[WebService(Namespace = "/")][WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]public class myTest : System.Web.Services.WebService {public myTest () {//Uncomment the following line if using designed components//InitializeComponent();}[WebMethod]public int Add(int x, int y){return x + y;}}5.运行此时任务栏右下角的指示区域会出现我们的ADS,假设它目前的端口是"3660",那么对应的页面地址就是:"http://localhost:3660/soa/myTest.asmx"6.打开Microsoft Visual C# 2005 Express Edition--新建"windows application"---命名为"custom"---OK7.右键单击"solution Explorer"中的"References"---"Add web references" 这时会出现"Add web references" 的对话窗口,在URL栏中填入"http://localhost:3660/soa/myTest.asmx" ---单击“GO”---将“reference name”改成“KKK”---单击“add reference”8.向Form1中拖入一个Button1 和一个Lable1,添加一个button1_Click事件将“Form1.cs”替换为:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using custom.kkk;namespace custom{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e) {myTest t = new myTest();label1.Text = Convert.ToString(t.Add(2, 3));}}}好了,一个完整的例子演示完了!Microsoft Visual C# 2005 Express Edition。
C#通过Get、Post、Soap调⽤WebService的⽅法实现代码来源于⽹络,我只是作了⼀些修改!using System;using System.Web;using System.Xml;using System.Collections;using ;using System.Text;using System.IO;using System.Xml.Serialization;/// <summary>/// 利⽤WebRequest/WebResponse进⾏WebService调⽤的类/// </summary>public class WebServiceHelper{//<webServices>// <protocols>// <add name="HttpGet"/>// <add name="HttpPost"/>// </protocols>//</webServices>private static Hashtable _xmlNamespaces = new Hashtable();//缓存xmlNamespace,避免重复调⽤GetNamespace/// <summary>/// 需要WebService⽀持Post调⽤/// </summary>public static XmlDocument QueryPostWebService(String URL, String MethodName, Hashtable Pars){HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName);request.Method = "POST";request.ContentType = "application/x-www-form-urlencoded";SetWebRequest(request);byte[] data = EncodePars(Pars);WriteRequestData(request, data);return ReadXmlResponse(request.GetResponse());}/// <summary>/// 需要WebService⽀持Get调⽤/// </summary>public static XmlDocument QueryGetWebService(String URL, String MethodName, Hashtable Pars){HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName + "?" + ParsToString(Pars));request.Method = "GET";request.ContentType = "application/x-www-form-urlencoded";SetWebRequest(request);return ReadXmlResponse(request.GetResponse());}/// <summary>/// 通⽤WebService调⽤(Soap),参数Pars为String类型的参数名、参数值/// </summary>public static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars){if (_xmlNamespaces.ContainsKey(URL)){return QuerySoapWebService(URL, MethodName, Pars, _xmlNamespaces[URL].ToString());}else{return QuerySoapWebService(URL, MethodName, Pars, GetNamespace(URL));}}/// <summary>/// 通⽤WebService调⽤(Soap)/// </summary>/// <param name="URL"></param>/// <param name="MethodName"></param>/// <param name="Pars"></param>/// <param name="XmlNs"></param>/// <returns></returns>private static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars, string XmlNs){_xmlNamespaces[URL] = XmlNs;//加⼊缓存,提⾼效率HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);request.Method = "POST";request.ContentType = "text/xml; charset=utf-8";request.Headers.Add("SOAPAction", "\"" + XmlNs + (XmlNs.EndsWith("/") ? "" : "/") + MethodName + "\"");SetWebRequest(request);byte[] data = EncodeParsToSoap(Pars, XmlNs, MethodName);WriteRequestData(request, data);XmlDocument doc = new XmlDocument(), doc2 = new XmlDocument();doc = ReadXmlResponse(request.GetResponse());XmlNamespaceManager mgr = new XmlNamespaceManager(Table);mgr.AddNamespace("soap", "/soap/envelope/");String RetXml = doc.SelectSingleNode("//soap:Body/*/*", mgr).InnerXml;doc2.LoadXml("<root>" + RetXml + "</root>");AddDelaration(doc2);return doc2;}/// <summary>/// 通过WebService的WSDL获取XML名称空间/// </summary>/// <param name="URL"></param>/// <returns></returns>private static string GetNamespace(String URL){HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL + "?WSDL");SetWebRequest(request);WebResponse response = request.GetResponse();StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);XmlDocument doc = new XmlDocument();doc.LoadXml(sr.ReadToEnd());sr.Close();return doc.SelectSingleNode("//@targetNamespace").Value;/// 动态⽣成SOP请求报⽂内容/// </summary>/// <param name="Pars"></param>/// <param name="XmlNs"></param>/// <param name="MethodName"></param>/// <returns></returns>private static byte[] EncodeParsToSoap(Hashtable Pars, String XmlNs, String MethodName){XmlDocument doc = new XmlDocument();doc.LoadXml("<soap:Envelope xmlns:xsi=\"/2001/XMLSchema-instance\" xmlns:xsd=\"/2001/XMLSchema\" xmlns:soap=\"/soap/envelope/\"></soap:Envelope>"); AddDelaration(doc);XmlElement soapBody = doc.CreateElement("soap", "Body", "/soap/envelope/");XmlElement soapMethod = doc.CreateElement(MethodName);soapMethod.SetAttribute("xmlns", XmlNs);foreach (string k in Pars.Keys){XmlElement soapPar = doc.CreateElement(k);soapPar.InnerXml = ObjectToSoapXml(Pars[k]);soapMethod.AppendChild(soapPar);}soapBody.AppendChild(soapMethod);doc.DocumentElement.AppendChild(soapBody);return Encoding.UTF8.GetBytes(doc.OuterXml);}/// <summary>/// 将对象转换成XML节点格式/// </summary>/// <param name="o"></param>/// <returns></returns>private static string ObjectToSoapXml(object o){XmlSerializer mySerializer = new XmlSerializer(o.GetType());MemoryStream ms = new MemoryStream();mySerializer.Serialize(ms, o);XmlDocument doc = new XmlDocument();doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray()));if (doc.DocumentElement != null){return doc.DocumentElement.InnerXml;}else{return o.ToString();}}/// <summary>/// 设置WEB请求/// </summary>/// <param name="request"></param>private static void SetWebRequest(HttpWebRequest request){request.Credentials = CredentialCache.DefaultCredentials;request.Timeout = 10000;}/// <summary>/// 设置请求数据/// </summary>/// <param name="request"></param>/// <param name="data"></param>private static void WriteRequestData(HttpWebRequest request, byte[] data){request.ContentLength = data.Length;Stream writer = request.GetRequestStream();writer.Write(data, 0, data.Length);writer.Close();}/// <summary>/// 获取字符串的UTF8码字符串/// </summary>/// <param name="Pars"></param>/// <returns></returns>private static byte[] EncodePars(Hashtable Pars){return Encoding.UTF8.GetBytes(ParsToString(Pars));}/// <summary>/// 将Hashtable转换成WEB请求键值对字符串/// </summary>/// <param name="Pars"></param>/// <returns></returns>private static String ParsToString(Hashtable Pars){StringBuilder sb = new StringBuilder();foreach (string k in Pars.Keys){if (sb.Length > 0){sb.Append("&");}sb.Append(HttpUtility.UrlEncode(k) + "=" + HttpUtility.UrlEncode(Pars[k].ToString()));}return sb.ToString();}/// <summary>/// 获取Webservice响应报⽂XML/// </summary>/// <param name="response"></param>/// <returns></returns>private static XmlDocument ReadXmlResponse(WebResponse response){StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);String retXml = sr.ReadToEnd();sr.Close();XmlDocument doc = new XmlDocument();doc.LoadXml(retXml);return doc;/// 设置XML⽂档版本声明/// </summary>/// <param name="doc"></param>private static void AddDelaration(XmlDocument doc){XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "utf-8", null);doc.InsertBefore(decl, doc.DocumentElement);}}以上是在不引⽤WEB服务的条件下动态调⽤WEB服务⽅法,如果该服务地址不确定或后期有可能会变动,则采⽤上述这些⽅法会⽐较好,当然如果服务地址不会出现变更的情况下,可以在VS中直接引⽤WEB服务,然后就可调⽤⾃动⽣成的SOAPClient类来调⽤相应的WEB服务⽅法,这样就简单很多,如下:avar client = new SmsService.wmgwSoapClient(); //wmgwSoapClient就是引⽤WEB服务后⾃动⽣成的类string result = client.MongateSendSubmit(tuserId.Text, tpassword.Text, tpszMobis.Text, tpszMsg.Text, int.Parse(tiMobiCount.Text),tpszSubPort.Text, tMsgId.Text);。
winform引用webservice之前没做过什么成型的应用程序,一直以为webservice是和神秘的东西,前段时间在完善一个机场签牌系统网络版的时候见识了一下webservice大体是什么东西,具体用途,我没有做太深入的研究,只是把自己用到的东西整理一下,分享给大家。
我所理解的webservice就是一个web化的应用程序,是某些服务提供商通过互联网为用户提供在线服务。
服务运营商可以通过webservice给用户提供一个调用接口,用户可以通过互联网访问接口,用本地winform应用程序或者web程序调用接口中的方法。
这种方法主要是用户应用程序与服务提供商不在一台机器上的情况,如果是单击应用程序一般情况下就没有必要使用了,当然这不是绝对的,视情况而定。
近期在做一个项目,类似于eterm放大的项目,大体是写一个eterm模拟程序,可以通过输入指令和参数按照eterm的通信协议封装好发给航信服务器,然后将服务器返回结果做格式化处理成前端可以看到的结果,工作流程大体是前端将要执行的指令和参数通过webservice发送到计算机消息队列,eterm 从队列中取出指令执行指令并将处理好的结果发送到结果队列,webservice从结果队列中筛选结果返回给前端程序。
使用webservice前要建立一个webservice,使用vs新建一个web应用程序,这时系统会默认建立一个hello word的方法,我们直接在浏览器中浏览这个webservice 会看的一个hello word的方法点击会返回一个xml页面一个string的返回值,我们打开这个页面的代码可以看到,这是一个很简单的方法,xml中显示的就是return 的内容,webservice工作过程就是方法的执行过程,这个方法可以用参数的,和我们平时写的程序基本是一样的,只是他没有主函数。
[WebMethod]publicstring HelloWorld(int a,int b){return (a + b).ToString();}但是要记住一个[WebMethod] 下面一个调用接口这部分我不多说,写好的程序,要使用需要先发布,使用IIS 新建一个虚拟目录将文件发布到这个虚拟目录,并在iis里面将这个目录设置成应用程序,这样就完成发布了。
winform中对webservice的调用一般情况下winform调用webservice时步骤1添加服务引用---高级----添加web引用------填写url--添加web引用即可完成对webservice的引用让环境来为我们生成服务代理,然后调用对应的Web服务。
如果需要动态调用WebService,要实现这样的功能:publicstaticobjectInvokeWebService(stringurl, stringmethodname,object[] args) 其中,url是Web服务的地址,methodname是要调用服务方法名,args是要调用Web服务所需的参数,返回值就是web服务返回的结果了。
要实现这样的功能,你需要这几个方面的技能:反射、CodeDom、编程使用C#编译器、WebService。
在了解这些知识后,就可以容易的实现web服务的动态调用了:using System;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;using System.IO;using ;usingSystem.CodeDom;piler;usingSystem.Web.Services.Description;usingMicrosoft.CSharp;namespaceNetbankTMP{public static class WebServiceHelper{/// <summary>/// 动态调用WebService/// </summary>/// <param name="url">WebService地址</param>/// <param name="methodname">方法名(模块名)</param>/// <param name="args">参数列表,无参数为null</param>/// <returns>object</returns>public static object InvokeWebService(string url, string methodname, object[] args) {returnInvokeWebService(url, null, methodname, args);}/// <summary>/// 动态调用WebService/// </summary>/// <param name="url">WebService地址</param>/// <param name="classname">类名</param>/// <param name="methodname">方法名(模块名)</param>/// <param name="args">参数列表</param>/// <returns>object</returns>public static object InvokeWebService(string url, string classname, string methodname, object[] args){string @namespace = "bank.WebService.webservice";if (classname == null || classname == ""){classname = WebServiceHelper.GetClassName(url);}//获取服务描述语言(WSDL)WebClientwc = new WebClient();Stream stream = wc.OpenRead(url+"?WSDL");//【1】ServiceDescriptionsd = ServiceDescription.Read(stream);//【2】ServiceDescriptionImportersdi = new ServiceDescriptionImporter();//【3】sdi.AddServiceDescription(sd, "", "");CodeNamespacecn = new CodeNamespace(@namespace);//【4】//生成客户端代理类代码CodeCompileUnitccu = new CodeCompileUnit();//【5】spaces.Add(cn);sdi.Import(cn, ccu);CSharpCodeProvidercsc = new CSharpCodeProvider();//【6】ICodeCompilericc = csc.CreateCompiler();//【7】//设定编译器的参数CompilerParameterscplist = new CompilerParameters();//【8】cplist.GenerateExecutable = false;cplist.GenerateInMemory = true;cplist.ReferencedAssemblies.Add("System.dll");cplist.ReferencedAssemblies.Add("System.XML.dll");cplist.ReferencedAssemblies.Add("System.Web.Services.dll");cplist.ReferencedAssemblies.Add("System.Data.dll");//编译代理类CompilerResultscr = pileAssemblyFromDom(cplist, ccu);//【9】if (true == cr.Errors.HasErrors){System.Text.StringBuildersb = new StringBuilder();foreach (CompilerErrorce in cr.Errors){sb.Append(ce.ToString());sb.Append(System.Environment.NewLine);}throw new Exception(sb.ToString());}//生成代理实例,并调用方法System.Reflection.Assembly assembly = piledAssembly;Type t = assembly.GetType(@namespace+"."+ classname, true, true);object bj = Activator.CreateInstance(t);//【10】System.Reflection.MethodInfo mi = t.GetMethod(methodname);//【11】returnmi.Invoke(obj, args);}private static string GetClassName(string url){//假如URL为"http://localhost/InvokeService/Service1.asmx"//最终的返回值为 Service1string[] parts = url.Split('/');string[] pps = parts[parts.Length - 1].Split('.');returnpps[0];}}}上面的注释已经很好的说明了各代码段的功能,下面给个例子看看,这个例子是通过访问/globalweather.asmx服务来获取各大城市的天气状况。
stringurl="/globalweather.asmx";string[] args=newstring[2] ;args[0]=this.textBox_CityName.Text ;args[1]="China";objectresult=WebServiceHelper.InvokeWebService(url ,"GetWeather",args) ;bel_Result.Text=result.ToString() ;如果没有参数,则参数为null上述的例子中,调用web服务使用了两个参数,第一个是城市的名字,第二个是国家的名字,Web服务返回的是XML文档,可以从其中解析出温度、风力等天气情况。
关于这段代码的注释【2】 ServiceDescription类提供一种方法,以创建和格式化用于描述 XML Web services 的有效的 Web 服务描述语言 (WSDL) 文档文件,该文件是完整的,具有适当的命名空间、元素和特性。
无法继承此类。
ServiceDescription.Read 方法 (Stream) 通过直接从 Stream实例加载 XML 来初始化ServiceDescription类的实例。
【3】 ServiceDescriptionImporter 类公开一种为 XML Web services 生成客户端代理类的方法。
ServiceDescriptionImporter.AddServiceDescription 方法将指定的ServiceDescription添加到要导入的ServiceDescriptions值的集合中。
【4】 CodeNamespace表示命名空间声明。
【5】 CodeCompileUnit会提供一个CodeDOM程式圆形的容器,CodeCompileUnit含有一个集合,可以储存含有CodeDOM原始程式码原形,专案参考的组件集合以及专案组件属性集合的CodeNamespace物件。
【6】 CSharpCodeProvider类提供存取C#程式码产生器和程式码编译器的执行个体。
【7】取得C#程式码编译器的执行个体【8】创建编译器的参数实例【9】 CompilerResults表示从编译器返回的编译结果。