C实现WebService
在没有安装IIS的情况下使用vc和VWD实现WEBservice的实验
在没有安装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#实现WebService上传下载文件
C#实现WebService上传下载文件WebService代码:////// 上传文件////// 文件的byte[]/// 上传文件的路径/// 上传文件名字///[WebMethod]public bool UploadFile(byte[] fs, string path, string fileName) {bool flag = false;try{//获取上传案例图片路径path = Server.MapPath(path);if (!Directory.Exists(path)){Directory.CreateDirectory(path);}//定义并实例化一个内存流,以存放提交上来的字节数组。
MemoryStream m = new MemoryStream(fs);//定义实际文件对象,保存上载的文件。
FileStream f = new FileStream(path + "\" + fileName, FileMode.Create);//把内内存里的数据写入物理文件m.WriteT o(f);m.Close();f.Close();f = null;m = null;flag = true;}catch (Exception ex){flag = false;}return flag;}[WebMethod(Description = "下载服务器站点文件,传递文件相对路径")]public byte[] DownloadFile(string strFilePath, string path){FileStream fs = null;string CurrentUploadFolderPath = HttpContext.Current.Server.MapPath(path);string CurrentUploadFilePath = CurrentUploadFolderPath + "\" + strFilePath;if (File.Exists(CurrentUploadFilePath)){try{///打开现有文件以进行读取。
c调用webservice接口的方法
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文档中提取出需要的数据。
C#WebService创建、发布、调用的实例讲解
C#WebService创建、发布、调⽤的实例讲解Web service是⼀个平台独⽴的,低耦合的,⾃包含的、基于可编程的web的应⽤程序,可使⽤开放的XML标准来描述、发布、发现、协调和配置这些应⽤程序,⽤于开发分布式的互操作的应⽤程序。
Web service是⼀种可以接收从Internet或者Internet上的其它系统中传递过来的请求,轻量级的独⽴的通讯技术。
webservice说明:假设A是Client端,B是webservice服务端,⽤户通过http协议向服务器发送soap请求,webservice返回客户端XML格式的数据。
客户端由代理对象(proxy)负责与webservice的通信。
所以在客户端使⽤webservice,完全和使⽤⼀个本地对象是⼀样的。
我们现在以⼀个简单的实例来说明。
⼀、⾸先创建Webservice⼯程,以VS2010为例,如果选择.Net Framework 4,则找不到Web服务应⽤程序,此时选择空Web应⽤程序。
创建好空应⽤程序后,选择该⼯程右键添加Web服务。
创建好程序后默认会有⼀个HellWorld函数a) WebService1.asmx⽂件中的代码namespace WebApplication1{[WebService(Namespace = "/")] // webservice命名空间[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)][ponentModel.ToolboxItem(false)]// 若要允许使⽤ AJAX 从脚本中调⽤此 Web 服务,请取消对下⾏的注释。
// [System.Web.Script.Services.ScriptService]public class WebService1 : System.Web.Services.WebService{[WebMethod]public string HelloWorld() {return "Hello World";}}}b) 运⾏程序,如图1所⽰,列出了服务函数名,点击要调⽤的函数如图2所⽰,点击调⽤后出现图2第⼆张图所⽰返回函数值。
c 调用webservice实例和开发
调用WebService 实例和开发 C 语言应用程序可以通过多种方式实现,以下是其中一种简单的方法:1.获取WebService 的WSDL(Web Services Description Language)文件。
WSDL 文件描述了WebService 的接口和数据类型,可以通过它来生成客户端代码。
2.使用工具生成客户端代码。
有许多工具可以从WSDL 文件生成客户端代码,例如Microsoft 的Wsdl.exe 或Apache 的wsdl2h。
这些工具可以根据WSDL 文件生成C 语言的头文件和源文件。
3.编写 C 语言应用程序。
使用生成的代码,编写 C 语言应用程序来调用WebService。
在应用程序中,需要包含生成的代码,并使用相应的函数和数据类型来调用WebService。
4.编译和运行应用程序。
将应用程序编译并运行,然后调用WebService。
以下是一个简单的示例代码,演示如何使用生成的客户端代码调用WebService:c复制代码#include"mywebservice.h"// 生成的客户端代码的头文件int main() {MyWebService *service = NULL; // 创建 WebService 对象MyWebService_MyOperationRequest request; // 创建请求对象MyWebService_MyOperationResponse response; // 创建响应对象// 设置请求参数request.param1 = "value1";request.param2 = "value2";// 调用 WebServiceservice->MyOperation(request, &response);// 处理响应结果printf("Response code: %d\n", response.responseCode);printf("Response message: %s\n", response.responseMessage);// 释放资源if (service) {delete service;service = NULL;}return0;}以上是一个简单的示例,具体实现需要根据实际的WebService 和数据类型进行调整。
使用C#创建webservice及三种调用方式
使用C#创建webservice及三种调用方式微软.NET战略的一个比较重要的部分就是webservice,利用webservice我们可以创建真正有效的分布式应用程序。
下面,我们对webservice做一些说明。
假设A是客户端,B是webservice服务端,用户通过http协议向服务器发送soap请求,webservice返回客户端XML格式的数据。
现在我们看一看创建一个webservice的大致过程:服务端的webservice是必须要建的。
中间的soap,xml我们不用去关心,在客户端这边,比较重要的是如何从webservice取得对象?答案是用的是proxy对象。
客户端由代理对象(proxy)负责与webservice的通信。
所以在客户端使用webservice,完全和使用一个本地对象是一样的。
我们现在以一个简单的实例来说明。
打开,新建工程( web服务),在位置中键入http://localhost/webserver,其中webserver就是工程的名字。
确定后,出现一个Service1.asmx.cx,双击,出现代码窗口,using System;using System.Collections;using ponentModel;using System.Data;using System.Diagnostics;using System.Web;using System.Web.Services;namespace webserver{/// <summary>/// Service1 的摘要说明。
/// </summary>(1)public class Service1 : System.Web.Services.WebService{public Service1(){//CODEGEN:该调用是 Web 服务设计器所必需的InitializeComponent();}#region Component Designer generated code//Web 服务设计器所必需的private IContainer components = null;/// <summary>/// 设计器支持所需的方法 - 不要使用代码编辑器修改/// 此方法的内容。
C#调用WebService的三种方法
C#调⽤WebService的三种⽅法最近⽤到了webService的调⽤,因为是远程调⽤,并且对⽅的webService是⽤Java写的,开发过程遇到很多问题,现在把⽤到的⽅法总结⼀下。
1.静态调⽤这是最便捷的⽅法,分为直接使⽤webService地址调⽤,和使⽤本地xml⽂件调⽤。
如下图,如果直接调⽤?wsdl的地址,就把地址复制黏贴到地址框⾥,如果本地没法连接到⽹址,就把?wsdl的地址⽤浏览器打开,保存成xml⽂件,拷贝到本地,再把本地xml⽂件的地址【类似C:\Users\admin\Desktop\XX.xml】复制到下图的地址框⾥,然后点击转到,会在绿⾊的框⾥显⽰:“在地址XX处找到1个服务”,然后修改下命名空间【可以不改】,点击确认。
然后在代码的【Connected Services】⽂件夹下,可以找到⼀个【Reference.cs】的⽂件,这⾥⾯就有引⽤的webService的⽅法。
调⽤的⽅法很简单,在Reference.cs⾥找到开发⽂档⾥提到的⽅法,正常实例化,调⽤就可以,需要引⽤下图蓝框⾥定义的命名空间。
另外,如果调⽤时出现这样的报错:【基础连接已关闭:未能为SSL/TLS安全通道建⽴信任关系】,可以按下⾯三步解决,(1)需要在【Reference.cs】⾥添加引⽤:using ;using .Security;using System.Security.Authentication;using System.Security.Cryptography.X509Certificates;(2)在调⽤的类⾥添加⽅法:private static bool RemoteCertificateValidate(object sender, X509Certificate cert,X509Chain chain, SslPolicyErrors error){System.Console.WriteLine("Warning, trust any certificate");// trust any certificatereturn true;//为了通过证书验证,总是返回true}(3)在类的构造⽅法调⽤上⾯⽅法:ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate;//验证服务器证书回调⾃动验证2.动态调⽤动态调⽤需要借助帮助类,这⾥⾯我已经加上了解决【SSL/TLS】问题的代码,代码如下。
C#动态调用WebService
C#动态调用WebService第一篇:C# 动态调用Web Service整理,内容来源于网络及本人实践】前面整理了一篇关于VS2008实现简单的WebService的文章,但里面的调用是静态的,当服务地址更改后,需要重新编译程序,对于很多应用来说是不现实的。
本文介绍一下C#动态调用WebService 的方法。
1.实现写个叫WebServiceHelper的类[csharp] view plaincopyprint?space webhelp2.{ing System;ing ;ing System.IO;ing System.CodeDom;ing Microsoft.CSharp;ing piler;ing System.Web.Services.Description;ingSystem.Web.Services.Protocols;11.public class WebServiceHelper 12.{ 13.#region InvokeWebService 14.15.public static object InvokeAndCallWebService(string url, string methodname, object[] args)16.{ 17.return WebServiceHelper.InvokeAndCallWebService(url, null, methodname, args);18.} 19.public static object InvokeAndCallWebService(string url,/* string @namespace, */string classname, string methodname, object[] args)20.{ 21.string @namespace = “EnterpriseServerBase.WebService.DynamicWebCalling”;22.if(( classname == null)||(classn ame == “"))23.{ 24.classname = WebServiceHelper.GetWsClassName(url);25.} 26.27.try 28.{ 29.//获取WSDL 30.WebClient webClient = new WebClient();31.Stream stream = webClient.OpenRead(url + ”?WSDL“);32.ServiceDescription description =ServiceDescription.Read(stream);33.ServiceDescriptionImporter descriptionImporter = new ServiceDescriptionImporter();34.descriptionImporter.AddService Description(description, ”“, ”“);35.CodeNamespace codeNamespace = new CodeNamespace(@namespace);36.37.//生成客户端代理类代码38.CodeCompileUnit codeCompileUnit = new CodeCompileUnit();spaces.Add(code Namespace);40.descriptionImporter.Import(codeNamespace, codeCompileUnit);41.CSharpCodeProvider codeProvider = new CSharpCodeProvider();42.43.//设定编译参数pilerParameters compilerParameters = new CompilerParameters();pilerParameters.GenerateExecutabl e = false;pilerParameters.GenerateInMemory = true;pilerParameters.ReferencedAssemblies.Add(”Syste m.dll“);pilerParameters.ReferencedAssemblies.Add(”Sy stem.XML.dll“);pilerParameters.ReferencedAssemblies.A dd(”System.Web.Services.dll“);pilerParameters.Referen cedAssemblies.Add(”System.Data.dll“);51.52.//编译代理类pilerResults codeResult = pileAssemblyFromDom(compilerParameters, codeCompileUnit);54.if(true == codeResult.Errors.HasErrors)55.{ 56.System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();57.foreach(pil pilerError compileError in codeResult.Errors)58.{ 59.stringBuilder.Append(compileError.ToSt ring());60.stringBuilder.Append(System.Environment.NewLine);6 1.} 62.throw new Exception(stringBuilder.ToString());63.} 64.65.//生成代理实例,并调用方法66.System.Reflection.Assembly assembly = piledAssembly;67.Type @class = assembly.GetType(@names pace + ”.“ + classname, true, true);68.object instance = Activator.CreateInstance(@class);69.System.Reflection.MethodIn fo methorInfo = @class.GetMethod(methodname);70.71.return methorInfo.Invoke(instance, args);72.73.} 74.catch(Exception ex)75.{ 76.throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));77.} 78.} 79.80.private static string GetWsClassName(string wsUrl)81.{ 82.string[] parts = wsUrl.Split('/');83.string[] pps = parts[parts.Length-1].Split('.');84.85.return pps[0];86.} 87.#endregion 88.} 89.}2.注意1.)若编译提示“命名空间“System.Web”中不存在类型或命名空间名称“Services”(是缺少程序集引用吗?)”,只需在解决方案资源管理器中添加对System.Web.Services的程序集引用即可。
C#使用WebService
C#使⽤WebService⼀、新建webservice1. 新建项⽬→ Web服务应⽤程序2. 或者在现有项⽬中点击右键新建web服务程序asmx3.4.5. 只要在webservice类⾥⾯的⽅法标注为【WebMethod】就成为别⼈可以调的⽅法6.7. 如果要返回DataTable8. 只要 DataTable.TableName 不为空, 即可返回否则不⾏.9. ⼆、webservice调⽤引⽤之后直接就可以使⽤⾥⾯的⽅法了命名空间类名 client=new 类; client.⽅法()常⽤错误①⽆法加载协定为“ServiceReference1.InterfaceSoap”的终结点配置部分,因为找到了该协定的多个终结点配置。
请按名称指⽰⾸选的如果出现以上错误是因为第⼀次引⽤webservice的时候已经在webconfig⾥⾯产⽣了<endpoint>配置节点,⾸次运⾏的时候⼜⼀次加了那么⼀个配置节点重复了,需要⼿动删除⼀个节点原因是在web.config ⽂件中多次引⽤了“添加外部引⽤”<client><endpoint address="http://218.90.168.115:8000/PJSDFacade/PJSD/Interface.asmx"binding="basicHttpBinding" bindingConfiguration="InterfaceSoap"contract="ServiceReference1.InterfaceSoap" name="InterfaceSoap" /><!-- 下⾯节点删除--><endpoint address="http://218.90.168.115:8000/PJSDFacade/PJSD/Interface.asmx"binding="customBinding" bindingConfiguration="InterfaceSoap12"contract="ServiceReference1.InterfaceSoap" name="InterfaceSoap12" /></client>所以删掉⼀个节点既可(如查引⽤的是WebServiceSoap,删掉WebServiceSoap1的有关节点,反之~)也可以在页⾯引⽤的时候指定bindingConfiguration名字:如:ServiceReference.WebServiceSoap web = new WebServiceSoapClient("InterfaceSoap");在调⽤webservice返回数据的时候,出现以下错误:已超过传⼊消息(65536)的最⼤消息⼤⼩配额。
vc webservice execute方法
VC Webservice Execute方法在VC(Visual C++)中,Webservice Execute方法是一种非常重要的方法,它用于执行与Webservice相关的操作。
在本文中,我将对VC Webservice Execute方法进行深入探讨,以便你能更全面地了解这一主题。
1. 了解VC Webservice Execute方法的基本概念VC Webservice Execute方法是VC中用于执行与Webservice相关操作的方法。
它提供了一种方便的方式来访问和操作Webservice,实现了客户端与服务器端之间的通信和数据交换。
通过调用该方法,可以实现对Webservice的调用和数据传输,为程序的运行和信息交互提供了便利。
2. VC Webservice Execute方法的具体用法在使用VC Webservice Execute方法时,需要首先创建一个Webservice对象,然后通过该对象调用Execute方法来执行相应的操作。
通过传入参数和调用相应的接口,可以实现与Webservice的交互和数据传输。
在实际应用中,可以根据具体的需求和情景来灵活运用该方法,实现各种功能和业务逻辑的实现。
3. VC Webservice Execute方法的优缺点优点:VC Webservice Execute方法提供了一种便捷的方式来实现与Webservice的交互和数据传输,加快了程序的开发和实现过程。
通过该方法,可以更快速地实现各种功能和业务逻辑,提高了程序的效率和灵活性。
缺点:在使用VC Webservice Execute方法时,需要较为熟练地掌握相关知识和技能,以确保方法的正确调用和使用。
需要注意对数据的传输和处理,以避免出现错误和问题。
4. 个人观点与理解对于VC Webservice Execute方法,我认为它是一种非常实用和便捷的方法,能够有效地实现程序与Webservice之间的通信和数据交换。
用 C 实现 WebService
用 C 实现WebService作者:求是赤子一、系统环境Linux 操作系统kernel2.4.2,安装gsoap2.6 到目录/usr/local/gsoap二、gSOAP 的简要使用例子下面是一个简单的例子,实现一个加法运算的WebService,具体功能是客户端(client)输入num1 和num2,服务器端(server)返回num1 和num2 相加的结果sum。
1、首先,我们需要做的是写一个函数声明文件,来定义接口函数ns__add,文件名字为add.h,内容如下://gsoap ns service name: add//gsoap ns service namespace: /add.wsdl//gsoap ns service location: //gsoap ns service executable: add.cgi//gsoap ns service encoding: encoded//gsoap ns schema namespace: urn:addint ns__add( int num1, int num2, int* sum );2、然后我们需要创建文件Makefile,从而利用gsoapcpp2 工具由add.h 生成一些.xml 文件、.c 文件和.h 文件,这些文件均为自动生成,Makefile的内容如下:GSOAP_ROOT=/usr/local/gsoapWSNAME=addCC=g++ -g -DWITH_NONAMESPACESINCLUDE=-I $(GSOAP_ROOT)SERVER_OBJS=$(WSNAME)C.o $(WSNAME)Server.o stdsoap2.oCLIENT_OBJS=$(GSOAP_ROOT)/env/envC.o $(WSNAME)ClientLib.o stdsoap2.oALL_OBJS=${WSNAME}server.o $(WSNAME)C.o $(WSNAME)Server.o ${WSNAME}test.o \${WSNAME}client.o $(WSNAME)ClientLib.o#总的目标all:server${WSNAME}.wsdl:${WSNAME}.h$(GSOAP_ROOT)/soapcpp2 -p$(WSNAME) -i -n -c ${WSNAME}.hstdsoap2.o:$(GSOAP_ROOT)/stdsoap2.c$(CC) -c $?#编译一样生成规则的.o文件$(ALL_OBJS):%.o:%.c$(CC) -c $? $(INCLUDE)#编译服务器端server:Makefile ${WSNAME}.wsdl ${WSNAME}server.o $(SERVER_OBJS) $(CC) ${WSNAME}server.o $(SERVER_OBJS) -o ${WSNAME}server#编译客户端client:Makefile ${WSNAME}.wsdl ${WSNAME}client.c ${WSNAME}test.c $(ALL_OBJS) stdsoap2.o$(CC) ${WSNAME}test.o ${WSNAME}client.o $(CLIENT_OBJS) -o ${WSNAME}testcl:rm -f *.o *.xml *.a *.wsdl *.nsmap $(WSNAME)H.h $(WSNAME)C.c $(WSNAME)Server.c $(WSNAME)Client.c \$(WSNAME)Stub.* $(WSNAME)$(WSNAME)Proxy.*$(WSNAME)$(WSNAME)Object.* $(WSNAME)ServerLib.c \ $(WSNAME)ClientLib.c $(WSNAME)server ns.xsd $(WSNAME)test3、我们先来做一个server 端,创建文件addserver.c 文件,内容如下:#include "addH.h"#include "add.nsmap"int main(int argc, char **argv){int m, s; /* master and slave sockets */struct soap add_soap;soap_init(&add_soap);soap_set_namespaces(&add_soap, add_namespaces);if (argc < 2){printf("usage: %s \n", argv[0]);exit(1);}else{m = soap_bind(&add_soap, NULL, atoi(argv[1]), 100);if (m < 0){soap_print_fault(&add_soap, stderr);exit(-1);}fprintf(stderr, "Socket connection successful: master socket = %d\n", m);for ( ; ; ){s = soap_accept(&add_soap);if (s < 0){soap_print_fault(&add_soap, stderr);exit(-1);}fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);add_serve(&add_soap);//该句说明该server 的服务soap_end(&add_soap);}}return 0;}//server端的实现函数与add.h中声明的函数相同,但是多了一个当前的soap连接的参数int ns__add(struct soap *add_soap, int num1, int num2, int *sum) {*sum = num1 + num2;return 0;}4、让我们的server跑起来吧:shell>makeshell>./addserver 8888如果终端打印出“Socket connection successful: master socket = 3”,那么你的server 已经在前台run 起来了,应该是值得高兴的!打开IE,键入http://localhost:8888,显示XML,服务已...〕Socket connection successful: slave socket = 4”,表示服务接收到了一次soap的连接。
C动态调用WebService服务方法
C#动态调用WebService服务方法调用举例:string xmlTxt = WebServiceHelper.InvokeWebService(interFaceUrl, MethodName, Objpara).ToString();代码:using System;using System.Collections.Generic;using System.Text;using System.IO;using ;using System.CodeDom;using piler;using System.Web.Services.Description;using Microsoft.CSharp;namespace mon{public static class WebServiceHelper{private static Dictionary<string, WebInvokePar> _DicInvokeType;public static Dictionary<string, WebInvokePar> DicInvokeType{get{if (_DicInvokeType == null)_DicInvokeType = new Dictionary<string, WebInvokePar>();return _DicInvokeType;}set { _DicInvokeType = value; }}/// <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, params object[] args){return InvokeWebService(url, null, methodname, args);}public static object InvokeWebService(string url, string classname, string methodname,params object[] args){return InvokeWebService(url, "WebServer", classname, 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 @namespace, string classname, string methodname, params object[] args){url = url.Trim();WebInvokePar tWebInkove = new WebInvokePar();System.Reflection.MethodInfo mi;if (DicInvokeType.ContainsKey(url)){tWebInkove = DicInvokeType[url];if (tWebInkove != null){mi = tWebInkove.WebType.GetMethod(methodname);//【11】if (mi != null)return mi.Invoke(tWebInkove.AssInstance, 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;var tps = assembly.GetTypes();Type t = null;if (tps.Length == 1)t = tps[0];elset = assembly.GetType(@namespace + "." + classname, true, true);object obj = Activator.CreateInstance(t);//【10】mi = t.GetMethod(methodname);//【11】if (mi == null) return "";tWebInkove.AssInstance = obj;tWebInkove.WebType = t;tWebInkove.WebUrl = url;DicInvokeType[url] = tWebInkove;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];}public class WebInvokePar{public string WebUrl { get; set; }public object AssInstance { get; set; }public Type WebType { get; set; }}}}。
在VC中调用WebService
在VC中调用WebService作者:叶小舟下载源代码一、什么是WebService ?WebService 其实就是一个基于网络的应用程序,它向外部程序提供一定的调用接口。
外部(远程)的程序,可以经由Web对其进行调用。
二、WebService 的特性:1.由于WebService 经由web服务器发布,所以比DCOM而言,可以顺利穿过防火墙。
这也是WebService 的优点之一,可以说,WebService ,为分布式应用的开发,提供了一个很好的平台。
2.对WebService 的调用,是通过SOAP协议进行的。
简单对象访问协议(SOAP)提供了标准的远程过程调用(RPC)方法来调用Web service。
而SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式,因此,对WebService 的调用也可以是跨平台的。
、三、怎样调用WebService ?Visual 内建提供了对WebService 的调用。
在中,调用WebService 只需要简单的几个步骤即可。
只要找到WebService 的发布地址,将地址引入到VC工程中。
这时,编译器会预先编译一次,自动生成和WebService 相关的头文件(也可以叫Web代理文件)WebService .h。
在你的程序中,包含WebService .h然后生成相关的对象,就可以对远程的WebService 进行调用了。
为演示怎样调用WebService ,我们用网上一个已经发布的WebService ,名字叫TranslateService,其功能是对多种语言进行互相翻译。
这个WebService 的地址如下:/TranslateService.asmx四、程序示例1.基于控制台的托管程序示例下面,我们先介绍中,基于控制台的托管程序,调用WebService 的例子:启动Visual 2003,新建一个Visual C++项目,类型选择为基于.NET 的托管控制台应用。
C++调用WebService的实现
C++调⽤WebService的实现前⾔:因为我们是Qt集成开发平台,⼀开始使⽤的是QGsoap。
QtSoap下载地址:⽽且QtSoap 近⼗年也没⼈在维护了,但是其中有个严重的问题是不⽀持https的WebService的调⽤。
⽬标:gSoap实现C++调⽤⽀持ssl的WebService服务接⼝。
因为⾃带的wsdl2h.exe并不⽀持ssl。
编译机器:windows7 x64, Visual Studio 2015gSOAP简介gSOAP是⼀个开发SOAP和XML应⽤(它们组成了webservice)的⼯具,在英⽂中叫toolkit。
它是跨平台的,webservice的客户端和服务器端,都可以⽤它来辅助开发。
它主要的功能(特征)如下:C/C++数据绑定⼯具,⽀持XML-RPCfrom/to JSON from/to C/C++ serialization⽀持WSDL 1.1,2.0, SOAP 1.1, 1.2⽀持REST HTTP(S) 1.0/1.1 operations (GET,PUT,POST etc) for XML, JSON,etc⽀持MIME and MTOM 附件⽀持IPv4,IPv6, TCP 和UDP⽀持CGI,FastCGI⽀持嵌⼊到Apache,IIS中发布⾃带了⼀个Web server (multithreaded, SSL, compression)⽤于发布可适⽤于WinCE, Palm, Symbian, VxWorks, Andriod, iPhone等⼩设备gsoap下载地址:下载开源:最近⼀次的Release的版本( 2021-07-09),现在好像是最新的是2.8.117了,不过没所谓,使⽤⽅式都是⼀样的。
下载OpenSSL:因为gsoap2.8如果要⽀持ssl编译的话,需要引⼊OpenSSL3.0,故先去下载安装OpenSSL3.0。
下载地址:,下载下来后,直接双击安装即可解压⽂件夹后,找到gsoap-2.8\gsoap\VisualStudio2005\wsdl2h⼯程,直接利⽤vs2015打开⼯程,会有⼀个⼯程转换,直接确定下⼀步即可。
c#_操作webservice(经典入门教程)
Web Service 的基本概念Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。
是:通过SOAP在Web上提供的软件(服务),使用WSDL文件进行(说明),并通过(UDDI)进行注册。
XML:(Extensible Markup Language)扩展型可标记语言。
面向短期的临时数据处理、面向万维网络,是Soap的基础。
Soap:(Simple Object Access Protocol)简单对象存取协议。
是XML Web Service 的通信协议。
当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。
SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。
WSDL:(Web Services Description Language) WSDL 文件是一个XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。
大多数情况下由软件自动生成和使用。
UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。
在用户能够调用Web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。
UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。
它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。
概念补充:http soap关系http:是一个客户端和服务器端请求和应答的标准(TCP)。
http协议其目的是为了提供一种发布和接收htttp页面的方法一http协议的客户端与服务器的交互:由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。
c#.net动态调用webservice的三种方式
动态调用webservice的三种方式多数时候我们通过"添加Web 引用..." 创建客户端代理类的方式调用WebService,但在某些情况下我们可能需要在程序运行期间动态调用一个未知的服务。
在.NET Framework 的命名空间中有我们需要的东西。
具体步骤:1. 从目标URL 下载WSDL 数据。
2. 使用ServiceDescription 创建和格式化WSDL 文档文件。
3. 使用ServiceDescriptionImporter 创建客户端代理类。
4. 使用CodeDom 动态创建客户端代理类程序集。
5. 利用反射调用相关WebService 方法。
上述步骤需要引用如下四个名称空间:using 动态调用WebService客户端动态调用代码using ;using ;using ;using ;usingusingusingusing使用WebClient 下载WSDL 信息。
WebClient web = new WebClient();Stream stream = ("");创建和格式化WSDL 文档。
ServiceDescription description = (stream);创建客户端代理代理类。
ServiceDescriptionImporter importer = new ServiceDescriptionImporter();= "Soap"; 使用CodeDom 编译客户端代理类。
CodeNamespace nmspace = new CodeNamespace(); 使用Reflection 调用WebService。
if (!{Assembly asm = ;Type t = ("WebService"); 生成客户端代理程序集文件上面的代码通过在内存中创建动态程序集的方式完成了动态调用过程。
vc中如何调用webservice?VCMFC进程线程DLL...
vc中如何调用webservice?VCMFC进程线程DLL...用msxml+soap#import "msxml4.dll"using namespace MSXML2;#import "C:\Program Files\Common Files\MSSoap\Binar ies\mssoap30.dll" \exclude("IStream", "IErrorInfo", "ISequentialStream", "_L ARGE_INTEGER", \"_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")using namespace MSSOAPLib30;string GetCompanyNameFromWeb(void){try{ISoapSerializerPtr Serializer;ISoapReaderPtr Reader;ISoapConnectorPtr Connector;// Connect to the service.Connector.CreateInstance(__uuidof(HttpConnector30));//Connector->Property["EndPointURL"] = "/UpLoadImag e.asmx";Connector->Property["EndPointURL"] = "http://localhost/ WebOfficeValidateService/Validate.asmx";Connector->Connect();// Begin the message.Connector->Property["SoapAction"] = "/GetCompanyName";Connector->BeginMessage();// Create the SoapSerializer object.Serializer.CreateInstance(__uuidof(SoapSerializer30));// Connect the serializer object to the input strea m of the connector object.Serializer->Init(_variant_t((IUnknown*)Connector->InputStre am));// Build the SOAP Message.Serializer->StartEnvelope("","","");Serializer->StartBody("");Serializer->StartElement("GetCompanyName","/","","");Serializer->StartElement("SerialNum","/","","");Serializer->WriteString(m_strSerial.c_str());Serializer->EndElement();Serializer->EndElement();Serializer->EndBody();Serializer->EndEnvelope();// Send the message to the XML Web service.Connector->EndMessage();// Read the response.Reader.CreateInstance(__uuidof(SoapReader30));// Connect the reader to the output stream of th e connector object.VARIANT_BOOL bl = Reader->Load(_variant_t((IUnknow n*)Connector->OutputStream), "");// Display the result._bstr_t bstrResult = Reader->RpcResult->text;return (char*)bstrResult;}catch(_com_error &e){return NULL;}}。
C#WebService创建与使用
C#WebService创建与使⽤WebService现在虽然有更好的⽅式去替代它(博主有⽂章,有兴趣童鞋可以进博主博客预览。
),它简单,开发成本低。
很简单,对着本⽂⼀看就会1.WebService的创建开发2.WebService的发布测试3.WebService的调⽤1.WebService的创建开发⾸先我们创建⼀个WebService的项⽬然后再添加添加成功后,可以启动⼀下项⽬看看⼤功告成,然后我们在⾥⾯写两个测试⽅法,现在是回到了最基本的页⾯开发⼀般处理逻辑的代码建议再另外添加类去写,此页⾯不建议写逻辑处理的东西,因为⼀个webservice服务有很多接⼝,代码太多,后期维护很⿇烦。
注意规范到⽬前都可以运⾏项⽬直接跑。
2.WebService的发布测试我们代码开发完成,得发布到服务器上去,供⼈使⽤。
点击项⽬发布起个中⽂名,然后进⼊连接⾥选择路径,OK。
⼀⼤步完成,进⼊计算机管理,这时候需要把IIS部署好,很简单百度上有,装完后重启,进⼊下⾯界⾯右键Default Web Site 添加虚拟⽬录别名随个⼈爱好,路径是上⾯我们发布⽂件的路径。
连接⾥我们设置成特定⽤户,⽤户名就是我们计算机的名字,⼀般是admin之类的,打开我的电脑可以看看,有密码写密码(开机密码知道吧),没密码不写。
点击测试设置看看通过不在对我们添加的⽂件夹右键转换为应⽤程序,然后预览看看这⾥很可能会出现各种错误,没出来这个页⾯。
别着急,我们先看看页⾯上的错误提⽰(基本上都是配置的问题,别着急,肯定能解决)在服务器上发布也是⼤同⼩异,配置⼀下hosts C:\Windows\System32\drivers\etc 然后拼⼀下端⼝(端⼝没开的话,在⼊站规则⾥添加,IP之类的可以不填,默认就⾏,调⽤时是服务器的IP+端⼝+加⾃⼰的接⼝)到这⾥基本上所有都完成了你的webservice接⼝全搞定,⾃⼰测试看看参数什么的然后把接⼝+参数交给别⼈就完事⼉了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
soap.error来判断soap的连接情况,这个返回值没有用到。 3. 接口函数的最后一个参数为传出参数,如果需要传出多个参 数,需要自己定义一个结构将返回项封装。 4. 在.h文件中不能include别的.h文件,可能不能生效,需要用 到某些结构的时候需要在该文件中直接声明。 5. 如果客户端的调用不需要返回值,那么最后一个参数 五.参考文档 1.gsoap主页 2.跟我一起写Makefile /develop/article/20/20025.shtm 3.Web Services: A Technical Introduction(机械工业出版 社) 六.备注 192.168.18.233和192.168.18.234的/usr/local/gsoap目录下的3 个需要的文件及一个env目录,不是编译安装的,是在别的地方编 译好了直接copy过来的(实际编译结果中还有wsdl2h工具及其他 一些文件,但是我们的实际开发中只是用到了这3个文件及env目 录)。因为时间仓促,本人还没有时间研究编译的问题,相关细 节可以查看参考文档1。 在192.168.18.233的/home/weiqiong/soap/sample目录下及 192.168.18.234的/tmp/soap/sample目录下有本文讲到的加法运 算的例子。
用C实现WebService 2007-08-24 10:07:11 一.系统环境 2 二.gSOAP的简要使用例子 2 三.图示说明 6 四.要注意的问题 6 五.参考文档 7 六.备注 7 一.系统环境 linux操作系统kernel2.4.2,安装gsoap2.6到目 录/usr/local/gsoap 二.gSOAP的简要使用例子 下面是一个简单的例子,实现一个加法运算的WebService,具体 功能是cli端输入num1和num2,server端返回一个num1和num2相加 的结果sum。 1. 首先,我们需要做的是写一个函数声明文件,来定义接口函 数ns__add,文件名字为add.h,内容如下: //gsoap ns service name: add //gsoap ns service namespace: /add.wsdl //gsoap ns service location: //gsoap ns service executable: add.cgi //gsoap ns service encoding: encoded //gsoap ns schema namespace: urn:add int ns__add( int num1, int num2, int* sum ); 2. 然后我们需要创建文件Makefile,从而利用gsoapcpp2工具由 add.h生成一些.xml文件、.c文件和.h文件,这些文件均为自动生 成,Makefile的内容如下: GSOAP_ROOT=/usr/local/gsoap WSNAME=add CC=g++ -g -DWITH_NONAMESPACES
*/ int add( const char* server, int num1, int num2, int *sum ) { struct soap add_soap; int result = 0; soap_init(&add_soap); soap_set_namespaces(&add_soap, add_namespaces); //该函数是客户端调用的主要函数,后面几个参数和add.h中声明 的一样,前面多了3个参数,函数名是接口函数名ns__add前面加 上soap_call_ soap_call_ns__add( &add_soap, server, "", num1, num2, sum ); if(add_soap.error) { printf("soap error:%d,%s,%s\n", add_soap.error, *soap_faultcode(&add_soap), *soap_faultstring(&add_soap) ); result = add_soap.error; } soap_end(&add_soap); soap_done(&add_soap); return result; } 6.我们最终写一个可以运行的客户端调用程序,创建文件 addtest.c,内容如下: #include <stdio.h> #include <stdlib.h> int add(const char* server, int num1, int num2, int *sum); int main(int argc, char **argv) {
int result = -1; char* server="http://localhost:8888"; int num1 = 0; int num2 = 0; int sum = 0; if( argc < 3 ) { printf("usage: %s num1 num2 \n", argv[0]); exit(0); } num1 = atoi(argv[1]); num2 = atoi(argv[2]); result = add(server, num1, num2, &sum); if (result != 0) { printf("soap err,errcode = %d\n", result); } else { printf("%d+%d=%d\n", num1, num2, sum ); } return 0; } 7.让我们的client端和server端通讯 shell>make client shell>./addtest 7 8 当然,你的server应该还在run,这样得到输出结果7+8=15,好 了,你成功完成了你的第一个C写的WebService,恭喜。 三.图示说明 四.要注意的问题 1. add.h文件前面的几句注释不能删除,为soapcpp2需要识别的 标志 2. 接口函数的返回值只能是int,是soap调用的结果,一般通过
INCLUDE=-I $(GSOAP_ROOT) SERVER_OBJS=$(WSNAME)C.o $(WSNAME)Server.o stdsoap2.o CLIENT_OBJS=$(GSOAP_ROOT)/env/envC.o $(WSNAME)ClientLib.o stdsoap2.o ALL_OBJS=${WSNAME}server.o $(WSNAME)C.o $(WSNAME)Server.o ${WSNAME}test.o ${WSNAME}client.o $(WSNAME)ClientLib.o #总的目标 all:server ${WSNAME}.wsdl:${WSNAME}.h $(GSOAP_ROOT)/soapcpp2 -p$(WSNAME) -i -n -c ${WSNAME}.h stdsoap2.o:$(GSOAP_ROOT)/stdsoap2.c $(CC) -c $? #编译一样生成规则的.o文件 $(ALL_OBJS):%.o:%.c $(CC) -c $? $(INCLUDE) #编译服务器端 server:Makefile ${WSNAME}.wsdl ${WSNAME}server.o $(SERVER_OBJS) $(CC) ${WSNAME}server.o $(SERVER_OBJS) -o ${WSNAME}server #编译客户端 client:Makefile ${WSNAME}.wsdl ${WSNAME}client.c ${WSNAME}test.c $(ALL_OBJS) stdsoap2.o $(CC) ${WSNAME}test.o ${WSNAME}client.o $(CLIENT_OBJS) -o ${WSNAME}test cl: rm -f *.o *.xml *.a *.wsdl *.nsmap $(WSNAME)H.h $(WSNAME)C.c $(WSNAME)Server.c $(WSNAME)Client.c $(WSNAME)Stub.* $(WSNAME)$(WSNAME)Proxy.* $(WSNAME)$(WSNAME)Object.* $(WSNAME)ServerLib.c $(WSNAME)ClientLib.c $(WSNAME)server ns.xsd $(WSNAME)test
socket = %d\n", s); add_serve(&add_soap);//该句说明该server的服务 soap_end(&add_soap); } } return 0; } //server端的实现函数与add.h中声明的函数相同,但是多了一个 当前的soap连接的参数 int ns__add(struct soap *add_soap, int num1, int num2, int *sum) { *sum = num1 + num2; return 0; } 4.让我们的server跑起来吧: shell>make shell>./addserver 8888 如果终端打印出“Socket connection successful: master socket = 3”,那么你的server已经在前台run起来了,应该是值 得高兴的。 打开IE,键入http://本机IP:8888,显示XML,服务已经启动,终 端打印出“Socket connection successful: slave socket = 4”,表示服务接收到了一次soap的连接。 5.让我们再来写个客户端(这个只是将soap的客户端函数封装一 下,具体的调用参见下面的addtest.c),创建文件 addclient.c,内容如下: #include "addStub.h" #include "add.nsmap" /** * 传入参数:server:server的地址 * num1,num2:需要相加的数 * 传出参数:sum:num1和num2相加的结果 * 返回值:0为成功,其他为失败