C++调用Webservice方法
- 格式:doc
- 大小:39.50 KB
- 文档页数:4
如何创建和发布Web ServiceWEB服务可以说是下一代WEB应用程序的基础,无论客户端是WINDOWS应用、ASP. NET Web Form程序、甚至其他语言的客户端,都可以与同一个WEB服务通信,其平台和语言无关性使其有了广阔的发展空间。
利用VS2005和IIS我们可以很容易地发布一个WEB SERVICE,因为其中有几个细节需要注意,所在初学者常常在这里出现问题,现通过一个简单的例子说明如何创建和发布一个WEB SERVICE。
环境:Windows Server 2003,.Net FrameWork 2.0,IIS6.0工具:VS20051.首先VS2005中新建一个WEB服务项目。
打开“文件”-“新建”-“网站”,在对话框中选择“ Web服务”,VS2005会自动生成一个Service.cs文件,包含如下代码:using System;using System.Web;using System.Web.Services;using System.Web.Services.Protocols;[WebService(Namespace = "/")][WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]public class Service : System.Web.Services.WebService{public Service () {//如果使用设计的组件,请取消注释以下行//InitializeComponent();}[WebMethod(Description="最简单的方法")]public string HelloWorld() {return "Hello World";}}你可以在这里修改自己的命名空间,加入自己的方法,但本文只是为了说明如何创建和发布,所以对Service.cs不做任何更改。
C#接⼝的Get、Post、WebService请求⽅法⼀览,值得收藏C# 接⼝的Get、Post、WebService请求⽅法⼀览,值得收藏public static class HttpHelper{const string DEFAULT_USER_AGENT = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 4.0.30319)";const string DEFAULT_CONTENT_TYPE = "application/json";#region Http Get Method///<summary>/// GET请求///</summary>///<param name="url"></param>///<returns></returns>public static string Get(string url){return Get(url, null);}///<summary>/// GET请求,可以添加⾃定义的Header信息///</summary>///<returns></returns>public static string Get(string url, IDictionary<string, string> headerList){var request = (HttpWebRequest)WebRequest.Create(url);erAgent = DEFAULT_USER_AGENT;request.ContentType = DEFAULT_CONTENT_TYPE;if (headerList != null){foreach (var header in headerList){request.Headers.Add(header.Key, header.Value);}}var responseStream = request.GetResponse().GetResponseStream();using (var reader = new StreamReader(responseStream)){var result = reader.ReadToEnd();responseStream.Close();return result;}}#endregion///<summary>/// POST请求///</summary>///<param name="url"></param>///<param name="postData"></param>///<param name="contentType"></param>///<returns></returns>public static string Post(string url, string postData, string contentType = DEFAULT_CONTENT_TYPE){var webClient = new WebClient();webClient.Headers.Add("user-agent", DEFAULT_USER_AGENT);webClient.Headers.Add("Content-Type", contentType);byte[] sendData = Encoding.UTF8.GetBytes(postData);byte[] responseData = webClient.UploadData(url, "POST", sendData);return Encoding.UTF8.GetString(responseData);}///<summary>/// POST请求,并可以传⼊Header信息///</summary>///<param name="url"></param>///<param name="postData"></param>///<param name="headParams"></param>///<returns></returns>public static string Post(string url, string postData, IDictionary<string, string> headParams){var webClient = new WebClient();webClient.Headers.Add("user-agent", DEFAULT_USER_AGENT);webClient.Headers.Add("Content-Type", DEFAULT_CONTENT_TYPE);if (headParams != null && headParams.Count > 0){foreach (var item in headParams){if (webClient.Headers.AllKeys.Contains(item.Key)){webClient.Headers.Remove(item.Key);}webClient.Headers.Add(item.Key, item.Value);}}byte[] sendData = Encoding.UTF8.GetBytes(postData);byte[] responseData = webClient.UploadData(url, "POST", sendData);return Encoding.UTF8.GetString(responseData);}///<summary>/// HTTP Post请求,可以传⼊Header信息和超时限制///</summary>///<param name="url"></param>///<param name="content"></param>///<param name="headParams"></param>///<param name="timeout"></param>///<returns></returns>public static string HttpPost(string url, string content,string ContentType, IDictionary<string, string> headParams,int timeout){try{string result = string.Empty;HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);req.Method = "POST";req.ContentType = ContentType;if (headParams != null && headParams.Count > 0){foreach (var item in headParams){if (req.Headers.AllKeys.Contains(item.Key)){req.Headers.Remove(item.Key);}req.Headers.Add(item.Key, item.Value);}}byte[] data = Encoding.UTF8.GetBytes(content);req.ContentLength = data.Length;req.Timeout = timeout * 1000;using (Stream reqStream = req.GetRequestStream()){reqStream.Write(data, 0, data.Length);reqStream.Close();}HttpWebResponse resp = (HttpWebResponse)req.GetResponse();Stream stream = resp.GetResponseStream();//获取响应内容using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)){result = reader.ReadToEnd();}return result;}catch (Exception ex){throw ex;}}///<summary>///需要WebService⽀持Get调⽤///</summary>public static string WebServiceGet(String url, String methodname, Hashtable pars){HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url + "/" + methodname + "?" + HashtableToPostData(pars)); request.Method = "GET";request.ContentType = "application/x-www-form-urlencoded";// 凭证request.Credentials = CredentialCache.DefaultCredentials;//超时时间request.Timeout = 10000;var response = request.GetResponse();var stream = response.GetResponseStream();StreamReader sr = new StreamReader(stream, Encoding.UTF8);String retXml = sr.ReadToEnd();sr.Close();return retXml;}///<summary>///需要WebService⽀持Post调⽤///</summary>public static string PostWebServiceByJson(String url, String methodname, Hashtable pars){HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url + "/" + methodname);request.Method = "POST";request.ContentType = "application/json;charset=utf-8";request.Credentials = CredentialCache.DefaultCredentials;request.Timeout = 10000;byte[] data = Encoding.UTF8.GetBytes(HashtableToPostData(pars));request.ContentLength = data.Length;Stream writer = request.GetRequestStream();writer.Write(data, 0, data.Length);writer.Close();StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream(), Encoding.UTF8);string retXml = sr.ReadToEnd();sr.Close();return retXml;}///<summary>/// http Post调⽤ WebService///</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";request.Credentials = CredentialCache.DefaultCredentials;request.Timeout = 10000;#region参数拼接成字符串,最后编码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()));}byte[] data = Encoding.UTF8.GetBytes(sb.ToString());#endregion#region把编码后的参数写⼊请求流中request.ContentLength = data.Length;Stream writer = request.GetRequestStream();writer.Write(data, 0, data.Length);writer.Close();#endregion#region读取结果,创建XmlDocument对象,对象加载结果var response = request.GetResponse();StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);String retXml = sr.ReadToEnd();sr.Close();XmlDocument doc = new XmlDocument();doc.LoadXml(retXml);#endregionreturn doc;}private static String HashtableToPostData(Hashtable ht){StringBuilder sb = new StringBuilder();foreach (string k in ht.Keys){if (sb.Length > 0){sb.Append("&");}sb.Append(HttpUtility.UrlEncode(k) + "=" + HttpUtility.UrlEncode(ht[k].ToString()));}return sb.ToString();}}。
C#异步调⽤WEBSERVICE1、使⽤事件驱动的异步模式的异步 Web 服务客户端Web 服务代理类中的每个 Web ⽅法都具有⼀个异步的对应版本。
代理类⾃动⽣成每个 Web ⽅法的异步⽅法和对应事件。
当异步⽅法被调⽤时,它将在另⼀个线程上执⾏,并在返回时引发对应的事件。
您可以为异步⽅法的对应事件创建⼀个处理程序,从⽽在它返回时执⾏代码。
此模型可以简化⽣成多线程应⽤程序的过程,因为您不必⾃⼰实现复杂的多线程代码。
具体做法:1、创建MethodCompleted 事件。
private void HelloWorldCompleted(Object sender,localhost.HelloWorldCompletedEventArgs Completed){// Insert code to implement the method here}2、向该事件的处理程序列表添加 MethodCompleted 事件处理程序。
myWebService.HelloWorldCompleted += new localhost.HelloWorldCompletedEventHandler(HelloWorldCompleted);3、使⽤该⽅法的 MethodAsync 形式调⽤ Web ⽅法.HelloWorldAsync();2、使⽤ Begin/End 模式的回调⽅法具体做法:定义实现 AsyncCallback 委托的回调函数。
public static void FactorizeCallback(IAsyncResult ar)实例化 AsyncCallback 委托。
AsyncCallback cb = new AsyncCallback(TestCallback.FactorizeCallback);调⽤ Begin ⽅法,将回调函数作为第⼆个参数传递,将提供状态的对象(在本⽰例中是 PrimeFactorizer的客户端实现)作为第三个参数传递。
MFC程序中调用webservice的实现介绍在MFC程序中调用webservice是一种常见的需求,通过调用webservice可以实现与远程服务器的数据交互。
本文将详细介绍如何在MFC程序中调用webservice的实现方法。
准备工作在开始之前,首先需要准备以下内容: 1. Visual Studio:在Windows平台上开发MFC程序常用的集成开发环境。
2. webservice接口:需要事先获取webservice的接口地址和相关参数。
3. MFC项目:创建一个MFC项目作为开发的基础。
步骤一:导入webservice引用1.打开MFC项目,在资源视图中右键单击名为”References”的文件夹,选择”Add Service Reference”。
2.在弹出的对话框中,输入webservice的地址,点击“Go”按钮。
3.Visual Studio将会检测webservice,并显示相关的方法和数据类型。
点击“OK”按钮确认导入。
步骤二:调用webservice方法1.在MFC项目中找到需要调用webservice的代码位置。
2.在代码中添加相关的头文件和命名空间:#include "yourWebService.h"using namespace YourWebServiceNamespace;3.创建webservice的实例并调用相应的方法:YourWebServiceName^ service = gcnew YourWebServiceName();service->YourMethod(param1, param2, ...);步骤三:处理webservice返回结果1.在调用webservice的方法之后,通常会返回一些数据信息。
2.根据webservice的返回类型,可以使用相应的数据类型接收返回值,例如字符串、整数、对象等。
3.根据业务需求,可以对返回结果进行处理,例如显示、存储或者进一步处理等。
c调用webservice接口的方法随着互联网的发展,Web服务已经成为了各种应用程序之间进行数据交互的重要方式。
而WebService接口则是Web服务的一种实现方式,它使用标准的HTTP协议进行通信,可以跨平台、跨语言地进行数据交互。
本文将介绍如何使用C语言调用WebService接口的方法。
首先,我们需要了解WebService接口的基本原理。
WebService接口通常使用SOAP(Simple Object Access Protocol)协议进行通信,SOAP是一种基于XML的协议,用于在网络上交换结构化的信息。
因此,我们在使用C语言调用WebService接口时,需要使用C语言的XML解析库来解析SOAP消息。
接下来,我们需要选择一个合适的C语言的XML解析库。
目前比较常用的XML解析库有Expat、Libxml2等。
这些库都提供了C语言的API,可以方便地解析XML文档。
我们可以根据自己的需求选择合适的库进行使用。
在开始调用WebService接口之前,我们需要了解接口的具体信息,包括接口的URL、请求方法、请求参数等。
通常,我们可以通过查阅接口的文档或者与接口提供方进行沟通来获取这些信息。
接下来,我们可以使用C语言的网络编程库来发送HTTP请求。
C语言提供了一些网络编程库,如libcurl等,可以方便地发送HTTP请求。
我们可以使用这些库来发送SOAP消息给WebService接口,并接收返回的SOAP消息。
在发送SOAP消息之前,我们需要根据接口的要求构造SOAP消息的XML文档。
我们可以使用C语言的XML解析库来构造XML文档,然后将XML文档转换为字符串,作为SOAP消息的内容发送给WebService接口。
当我们发送SOAP消息后,接口会返回一个SOAP消息作为响应。
我们可以使用C语言的网络编程库接收响应,并使用XML解析库解析响应的XML文档。
根据接口的要求,我们可以从XML文档中提取出需要的数据。
一、WebService在cs后台程序中的调用A、通过命名空间和类名直接调用示例:WebServicews = new WebService();string s = ws.HelloWorld();B、通过添加WEB引用的方式调用,首先添加WEB引用,通过URL指向WEBSERVICE,指定WEB引用名,假设为KK;示例:kk.WebService n = new kk.WebService();string ss=n.HelloWorld();二、WebService在前台页面的JS 调用方法1、首先通过下面的方法把Webservice在前台引用进来<asp:ScriptManagerrunat="server"><Services><asp:ServiceReference Path="WebService.asmx" InlineScript="True" /> </Services></asp:ScriptManager>2、然后就可以通过JS程序进行调用,示例如下:<script type="text/jscript">function a(){WebService.HelloWorld(onresult);}//这里的onresult是回调函数function onresult(result){alert(result);}function b(){WebService.add(1,2,onreturn)}function onreturn(result){alert(result);}//下面的'context'是上下文,可以通过回到函数通过重载的方式获得;function c(){WebService.div(1,1,onresultC,onerror,'context');}function onresultC(res,c){alert(res);alert(c);}//onerror是获得异常信息的回调函数,下面给出了获得异常信息的方法function onerror(error){var a="";a=String.format("获取服务器端异常的具体类型:{0}\t\n获取详细的异常描述信息:{1}\t\n获取造成异常的:{2}\t\n获取服务器端异常的堆栈跟踪信息:{3}\t\n获取一个布尔值,表示异常是否是由于网络连接超时造成的{4}",error.get_exceptionType(),error.get_message(),error.get_statusCode(),error.get_stackTrace(),error.get_timedOut())alert(a);}a();b();c();</script>----自写小例子---web Service---:[WebMethod]public string HelloWorld() {return "Hello World,wwg";}[WebMethod]public intAddWwg(inta,int b){return a + b;}exe---using CallWebService.localhost; //因为自己没有定义命名空间namespaceCallWebService{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e) {Service serviceWwg = new Service();int i1 = Int32.Parse(txt1.Text.ToString());int i2 = Int32.Parse(txt2.Text.ToString());intiResult = serviceWwg.AddWwg(i1, i2);lb1.Text = iResult.ToString();}private void button2_Click(object sender, EventArgs e) {CallWebService.localhost.ServiceserviceWwg = new CallWebService.localhost.Service();string strResult = serviceWwg.HelloWorld();lb1.Text = strResult.ToString();}}}。
C#调⽤WebService实例和开发Web Service也叫XML Web Service WebService是⼀种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独⽴的通讯技术。
是:通过SOAP在Web上提供的软件服务。
XML Web Service的特点Web Service的主要⽬标是跨平台的可互操作性。
为了实现这⼀⽬标,Web Service 完全基于XML(可扩展标记语⾔)、XSD(XML Schema)等独⽴于平台、独⽴于软件供应商的标准,是创建可互操作的、分布式应⽤程序的新平台。
因此使⽤Web Service有许多优点: Web Service开发.net平台内建了对Web Service的⽀持,包括Web Service的构建和使⽤。
与其它开发平台不同,使⽤.net平台,你不需要其他的⼯具或者SDK就可以完成Web Service的开发了。
.net Framework本⾝就全⾯⽀持Web Service,包括服务器端的请求处理器和对客户端发送和接受SOAP消息的⽀持。
下来我们就⼀步⼀步的⽤Microsoft Visual Studio .net 2015(后⾯简称 2015)创建和使⽤⼀个简单的Web Service。
1:⾸选建⽴⼀个webservice 服务实例:(如下图)创建新的,WEB应⽤程序注意下图标识在创建好新的框架后,选中项⽬节点新添加(web服务asmx)⽂件,添加确定。
如下图⽣成简单的,程序语⾔的⿐祖语⾔“Hello,world”⽣成后我们直接选中运⾏(如下两图)所⽰,并且设为起始页效果如下图展⽰:(点击Helloworld)将直接调⽤,页⾯将返回业务所需要的参数数据。
完成以下图所⽰后,我们⼀个简单的webservice调⽤就成功了。
接下来我们设计⼀个加减法的调⽤。
在对应的webservice_eg中继续写第⼆个接⼝⽅法,如下代码⽚段简单的业务返回两数字相加之和[WebMethod (Description ="数字相加之和")]public int GetSum_Number(int a, int b){return a + b;}注意:虽然我们webservice接⼝做的可能很多,但都是照猫画虎类的,并没有真正的了解webservice中有些关键词的含义.例如:WebMethod 含义?WebMethod :web服务的命令,指⽰这个⽅法是web服务提供的⽅法,本⾝代表的就是⼀种属性,放在⼀个⽅法前⾯,表明下⾯的⽅法可以访问到该属性⾥的值。
C/C++与WEBSERVICEStart:2011.03.06Updated:2011.03.08王凡(wangfan)wf141732@woshiwangfan@/lingmengfei1.简介1.1.环境信息Gsoap:2.81.2.相关文档《LinuxCGI》2.软件准备2.1.Gsoap2下载地址:/project/gsoap2/gSOAP/gsoap_2.8.1.zip?r=http%3A%2F%%2Fprojects%2Fgsoap2%2Fdevelop&ts=1299399273&use_mirror=nchc下载后执行标准的配置编译2.2.服务器准备参照《Linux CGI》3.一个简单的例子做一个获取当前时间的例子3.1.服务端新增文件currentTime.h在上面注释的部分都是不可或缺的,其中双下划线是由于和java通信的标准只能采用Document/literal格式的标准。
另外location是到时候传输给服务器的接口部分。
在soap2目录/home/wangfan/gsoap2/gsoap/bin/linux386下面拷贝soapcpp2到建立的add.h目录下面,然后编译add文件编译完成后会在当前目录下面生成很多文件再来构建服务器代码,即处理逻辑部分然后编译成cgi3.2.Jdeveloper调用使用jdeveloper来生成客户端调用的代码写在client文件中package currenttime;import com.bea.staxb.types.XMLGregorianCalendar;import java.util.GregorianCalendar;import javax.xml.ws.WebServiceRef;// !THE CHANGES MADE TO THIS FILE WILL BE DESTROYED IF REGENERATED!// This source file is generated by Oracle tools// Contents may be subject to change// For reporting problems, use the following// Version = Oracle WebServices (11.1.1.0.0, build 101221.1153.15811)public class CurrentTimeClient{@WebServiceRefprivate static CurrentTime_Service currentTime_Service;public static void main(String [] args){currentTime_Service = new CurrentTime_Service();CurrentTimePortType currentTimePortType =currentTime_Service.getCurrentTime();System.out.println(currentTimePortType.currentTime().toString());// Add your code to call the desired methods.4.常见问题4.1.Method 'current Time' not implemented: method name or namespace notrecognized注意在server的时候要用#include currentTime.nsmap。
在Visual Studio中调用Web服务的示例可以分为以下几个步骤:1. 创建新的项目:打开Visual Studio,选择“创建新项目”,然后选择合适的项目类型,例如Console应用程序或Web应用程序。
2. 添加Web引用:右键单击项目,在上下文菜单中选择“添加服务引用”或“添加Web引用”选项。
在弹出的对话框中,输入Web服务的URL地址,然后点击“Go”或“浏览”按钮。
找到并选择要调用的Web服务,点击“确定”按钮。
3. 生成代理类:Visual Studio将根据Web服务的WSDL(Web服务描述语言)文件生成代理类。
代理类用于与Web服务进行通信。
生成的代理类将自动添加到项目中。
4. 调用Web服务:在代码中实例化代理类,并调用其中定义的方法来访问Web服务的功能。
根据Web 服务的具体接口定义,传递必要的参数并获取返回结果。
下面是一个简单的示例,演示如何在Visual Studio中调用一个名为"HelloWorldService"的Web服务:```csharpusing System;namespace WebServiceExample{class Program{static void Main(string[] args){// 实例化代理类HelloWorldService.HelloWorldServiceClient client = new HelloWorldService.HelloWorldServiceClient();try{// 调用Web服务的方法string result = client.SayHello("John");// 打印返回结果Console.WriteLine(result);}catch (Exception ex){Console.WriteLine("调用Web服务出错:" + ex.Message);}// 关闭代理类client.Close();Console.ReadLine();}}}```在上述示例中,我们首先实例化了名为"HelloWorldServiceClient"的代理类。
c#调用javawebservice参数用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int类型、double和DateTime类型的值(在服务端得到的均为null)解决办法:VS2005封装WebService引用用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int类型、double和DateTime类型的值(在服务端得到的均为null)解决办法:VS2005封装WebService引用时,如果WebService发布的是一个基本数据类型组成的对象,则会对该对象的非string属性同时生成两个属性,一般是这样的"属性××"、"属性××Specif ied"。
而"属性名Specified"是一个bool类型,只有这个属性被设置成true时,"属性××"的值才会被序列化成xml传递。
同样的道理,用.NET提供WebService给JAVA调用时,如果是一个基本数据类型组成的对象,则会对该对象的非string属性同时生成两个属性,一般是这样的"属性××"、"属性××Specified"。
如果不将“属性××Specified”设置为true的话,服务端得到的数据将是null。
解决办法就是把“属性××Specified”设置为true或者把“属性××Specified”删掉。
资料:/zh-cn/library/system.xml.xmlattribute.specified(VS.80).aspx .NET Framework 类库XmlAttribute.Specified 属性获取一个值,该值指示是否显式设置了属性值。
### 先看上面的地址链接,方法和用法基本正确;### 编译器VS2008,MFC例子进行调用,生成的文件:MLGB.h, soapC.cpp, soapH.h, sopaStub.h, soapWebServiceSoap11BindingProxy.cpp, soapWebServiceSoap11BindingProxy.h, WebserviceSoap11Binding.nsmap### wsdl2h -s -o MLGB.h -t mytpemap.dat XXXXXXXXXXXXX (typemap.dat在\gsoap-2.8\gsoap\bin\win32目录下没有,把gsoap目录下的typemap.dat的文件复制到相应文件,并在最后添加上xsd__string = | std::wstring | wchar_t*即可)### soapcpp2 -i -C MLGB.h (找不到文件错误,尝试……import……什么的,添加路径的方法是在命令的最后添加,例如:spoap -i -C MLGB.h -I C:\gsoap-2.8\gsoap\import,这样这一步就可以生成相应的代码)### \gsoap-2.8\gsoap\bin\win32目录下没有生成soapClient.cpp, 另外要在\gsoap-2.8\gsoap\目录下把stdsoap2.h, stdsoap.cpp也拷贝到相应的程序目录,同时添加按上述链接文档中添加头文件### 方法的调用,参数传递的形式是XML格式:1.soap连接貌似是tcp短连接,方法调用完,对象貌似就得重新new一下(我用的时候遇到的是这种情况,之前写个小例子,用的全局变量,但是没有重新new也没问题,这个没有确认)2.在soapWebServiceSoap11BindingProxy.h中对应的类WebServiceSoap11BindingProxy3.webservice的url地址_strUrl=XXXXXXXXXXXXXXX例如:setStopTiralInfo的方法,其实两个都一样,调用第二个,前两个参数传递NULL/// Web service operation 'setStopTrialInfo' (returns error code or SOAP_OK)virtual int setStopTrialInfo(_ns1__setStopTrialInfo *ns1__setStopTrialInfo,_ns1__setStopTrialInfoResponse &ns1__setStopTrialInfoResponse) { returnthis->setStopTrialInfo(NULL, NULL, ns1__setStopTrialInfo, ns1__setStopTrialInfoResponse); }virtual int setStopTrialInfo(const char*endpoint, const char*soap_action, _ns1__setStopTrialInfo*ns1__setStopTrialInfo, _ns1__setStopTrialInfoResponse &ns1__setStopTrialInfoResponse);创建对象:WebServiceSoap11BindingProxy _webClient(_strUrl);对应参数:_ns1__setStopTrialInfo _input; _ns1__setStopTrialInfoResponse _return;对_input初始化:_input.soap = &_webClient; _input.soap_default(_input.soap);_input.soap_in(_input.soap, “ns1:setStopTrialInfo”, NULL);传递XML参数:因为中文问题,所以xmlParams是wchar_t*类型,不然中文乱码。
_input.xmlParams=_buf; _buf就是你申请的内存,其中存放你的xml字符串;一定要确认XML 字符串是正确的,也就是断点调试的时候,用XML格式可以正确查看,不然调用方法会失败;调用方法:if(_webClient.setStopTrailInfo(_input, _return) == SOAP_OK)……………////////////////////////////////////////////////////////////////整个代码如下:WebServiceSoap11BindingProxy_webClient(_strWebUrl);CString_strXml;_strXml.Format(_T("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\<xmlParams>\<ajxx>\<ajbs>%s</ajbs>\<tc>%s</tc>\<tsbs>%s</tsbs>\<ajlb>%s</ajlb>\<ah>%s</ah>\<ay>%s</ay>\<spzhmc>%s</spzhmc>\<dsr>%s</dsr>\<cbrbs>%s</cbrbs>\<cbr>%s</cbr>\<cbbmbs>%s</cbbmbs>\<cbbm>%s</cbbm>\<jyaq>%s</jyaq>\<larq>%s</larq>\<kssj>%s</kssj>\<jssj>%s</jssj>\<ftbs>%s</ftbs>\<ktdd>%s</ktdd>\<gkkt>%s</gkkt>\<spzbs>%s</spzbs>\<spz>%s</spz>\<hytcybs>%s</hytcybs>\<hytcy>%s</hytcy>\<sjybs>%s</sjybs>\<sjy>%s</sjy>\<fydm>%s</fydm>\<szftcs>%s</szftcs>\</ajxx>\</xmlParams>"), m_curTianDi_Sky_CaseInfo.ajbs,m_curTianDi_Sky_CaseInfo.tc,m_curTianDi_Sky_CaseInfo.tsbs,m_curTianDi_Sky_CaseInfo.ajlb,m_curTianDi_Sky_CaseInfo.ah,m_curTianDi_Sky_CaseInfo.ay,m_curTianDi_Sky_CaseInfo.spzhmc,m_curTianDi_Sky_CaseInfo.dsr,m_curTianDi_Sky_CaseInfo.cbrbs,m_curTianDi_Sky_CaseInfo.cbr,m_curTianDi_Sky_CaseInfo.cbbmbs,m_curTianDi_Sky_CaseInfo.cbbm,m_curTianDi_Sky_CaseInfo.jyaq,m_curTianDi_Sky_rq,m_curTianDi_Sky_CaseInfo.kssj,m_curTianDi_Sky_CaseInfo.jssj,m_curTianDi_Sky_CaseInfo.ftbs,m_curTianDi_Sky_CaseInfo.ktdd,m_curTianDi_Sky_CaseInfo.gkkt,m_curTianDi_Sky_CaseInfo.spzbs,m_curTianDi_Sky_CaseInfo.spz,m_curTianDi_Sky_CaseInfo.hytcybs,m_curTianDi_Sky_CaseInfo.hytcy,m_curTianDi_Sky_CaseInfo.sjybs,m_curTianDi_Sky_CaseInfo.sjy,m_curTianDi_Sky_CaseInfo.fydm,m_curTianDi_Sky_CaseInfo.szftcs);_ns1__setStopTrialInfo_input;_ns1__setStopTrialInfoResponse_return;_input.soap = &_webClient;_input.soap_default(_input.soap);_input.soap_in(_input.soap, "ns1:setStopTrialInfo", NULL);wchar_t_buf[1024*8] = {0};CharToWchar(_strXml, _buf, strlen(_strXml)*2);//赋值,XML格式的_input.xmlParams = _buf;/*int _len = strlen(_strXml);int _wlen = MultiByteToWideChar(CP_ACP, 0, (const char*)_strXml, int(_len), NULL, 0); _input.xmlParams = new wchar_t[_wlen+1];ZeroMemory(_input.xmlParams, wcslen(_input.xmlParams));MultiByteToWideChar(CP_ACP, 0, (const char*)_strXml, int(_len), _input.xmlParams, int(_wlen));_input.xmlParams[_wlen] = '\0';*/int_nResult = _webClient.setStopTrialInfo(&_input, _return);//上面就是整个的调用方式,封装成一个函数_input.soap = &_webClient;_input.soap_default(_input.soap);_input.soap_in(_input.soap, "ns1:setStopTrialInfo", NULL);# ns1:setStopTrialInfo, 这个是根据输入的参数来确定的,具体的查看方式为,查看_ns1__setStopTrialInfo的定义(光标放到上面,右键,转到定义),然后代码如下:#ifndef SOAP_TYPE__ns1__setStopTrialInfo#define SOAP_TYPE__ns1__setStopTrialInfo (20)/* ns1:setStopTrialInfo */class SOAP_CMAC_ns1__setStopTrialInfo{public:wchar_t *xmlParams; /* optional element of type xsd:string */struct soap *soap; /* transient */public:virtual int soap_type() const { return 20; } /* = unique type idSOAP_TYPE__ns1__setStopTrialInfo */virtual void soap_default(struct soap*);virtual void soap_serialize(struct soap*) const;virtual int soap_put(struct soap*, const char*, const char*) const;virtual int soap_out(struct soap*, const char*, int, const char*) const;virtual void *soap_get(struct soap*, const char*, const char*);virtual void *soap_in(struct soap*, const char*, const char*);_ns1__setStopTrialInfo() { _ns1__setStopTrialInfo::soap_default(NULL); } virtual ~_ns1__setStopTrialInfo() { }};#endif//看到class上面的哪个ns1:setStopTrialInfo没有,_input.soap_in(_input.soap, "ns1:setStopTrialInfo", NULL);问题:动态分配的内存,貌似释放不了(可能和char wchar_t之间的转换有关,MFC就是蛋疼的东西),一般方法频繁调用的话,要不然会出现ntdll.dll错误,要不然就是报“内存错误”。