『壹』 如何編寫webservice c
採用的工具VS2010生成工程
1. 生成webservice工程:建 ASP.NET 空WEB 應用程序。
2. 在建好的ASP.NET 空WEB應用程序中新建項「web 服務」。
完成上述內容工程結構如下圖
2. 然後再重新生成一下測試項目,最後在測試項目中定義一個測試方法並調用webservice中的方法。代碼如下
privatevoidbutton1_Click(objectsender, RoutedEventArgs e){YDTF.WebService1SoapClient aa =newYDTF.WebService1SoapClient();button1.Content = aa.HelloWorld();Menus m =newMenus();m.Name ="Name";m.NameSpace ="NameSpace";DataSet ds = aa.query();inti = ds.Tables[0].Rows.Count;}
3.單步調試一下若運行結果和預料一樣則成功了。
『貳』 JAVA調用c語言發布的webservice介面
Java調用WebService可以直接使用Apache提供的axis.jar自己編寫代碼,或者利用Eclipse自動生成WebService Client代碼,利用其中的Proxy類進行調用。理論上是一樣的,只不過用Eclipse自動生成代碼省事些。
1、編寫代碼方式:
packagecom.yun.test;
importjava.rmi.RemoteException;
importorg.apache.axis.client.Call;
importorg.apache.axis.client.Service;
importorg.apache.axis.message.PrefixedQName;
importorg.apache.axis.message.SOAPHeaderElement;
importcom.cezanne.golden.user.Exception;
importcom.cezanne.golden.user.UserManagerServiceProxy;
importjavax.xml.namespace.QName;
importjava.net.MalformedURLException;
importjavax.xml.rpc.ServiceException;
importjavax.xml.soap.Name;
importjavax.xml.soap.SOAPException;
publicclasstestWebService{
publicstaticStringgetResult()throwsServiceException,MalformedURLException,RemoteException,SOAPException
{
//標識WebService的具體路徑
Stringendpoint="WebService服務地址";
//創建Service實例
Serviceservice=newService();
//通過Service實例創建Call的實例
Callcall=(Call)service.createCall();
//將WebService的服務路徑加入到call實例之中.
call.setTargetEndpointAddress(newjava.net.URL(endpoint));//為Call設置服務的位置
//由於需要認證,故需要設置調用的SOAP頭信息。
NameheaderName=newPrefixedQName(newQName("發布的wsdl里的targetNamespace里的url","string_itemName"));
org.apache.axis.message.SOAPHeaderElementheader=newSOAPHeaderElement(headerName);
header.addTextNode("blablabla");
call.addHeader(header);
//=newSOAPHeaderElement("發布的wsdl里的targetNamespace里的url","SoapHeader");
//soapHeaderElement.setNamespaceURI("發布的wsdl里的targetNamespace里的url");
//try
//{
//soapHeaderElement.addChildElement("string_itemName").setValue("blablabla");
//}
//catch(SOAPExceptione)
//{
//e.printStackTrace();
//}
//call.addHeader(soapHeaderElement);
//調用WebService的方法
org.apache.axis.description.OperationDescoper;
org.apache.axis.description.ParameterDescparam;
oper=neworg.apache.axis.description.OperationDesc();
oper.setName("opName");
param=neworg.apache.axis.description.ParameterDesc(newjavax.xml.namespace.QName("","arg0"),org.apache.axis.description.ParameterDesc.IN,newjavax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema","string"),java.lang.String.class,false,false);
param.setOmittable(true);
oper.addParameter(param);
param=neworg.apache.axis.description.ParameterDesc(newjavax.xml.namespace.QName("","arg1"),org.apache.axis.description.ParameterDesc.IN,newjavax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema","string"),java.lang.String.class,false,false);
param.setOmittable(true);
oper.addParameter(param);
param=neworg.apache.axis.description.ParameterDesc(newjavax.xml.namespace.QName("","arg2"),org.apache.axis.description.ParameterDesc.IN,newjavax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema","string"),java.lang.String.class,false,false);
param.setOmittable(true);
oper.addParameter(param);
oper.setReturnType(newjavax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema","string"));
oper.setReturnClass(java.lang.String.class);
oper.setReturnQName(newjavax.xml.namespace.QName("","return"));
oper.setStyle(org.apache.axis.constants.Style.WRAPPED);
oper.setUse(org.apache.axis.constants.Use.LITERAL);
oper.addFault(neworg.apache.axis.description.FaultDesc(
newjavax.xml.namespace.QName("發布的wsdl里的targetNamespace里的url","Exception"),
"Exception",
newjavax.xml.namespace.QName("發布的wsdl里的targetNamespace里的url","Exception"),
true
));
call.setOperation(oper);
call.setOperationName(newjavax.xml.namespace.QName("發布的wsdl里的targetNamespace里的url","opName"));
//調用WebService,傳入參數
Stringres=(String)call.invoke(newObject[]("arg0","arg1"));
System.out.println("===============");
returnres;
}
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
try{
System.out.println(getResult());
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(RemoteExceptione){
e.printStackTrace();
}catch(ServiceExceptione){
e.printStackTrace();
}catch(SOAPExceptione){
e.printStackTrace();
}
}
}
2、利用Eclipse自動生成WebService client代碼就容易多了:
首先,new project,選擇other,在輸入框中輸入Web Service Client,選中搜索後的結果,點擊Next,在Service definition中輸入 WebService的發布地址,點擊Finish
這樣,WebService Client代碼已經生成好了。
接下來寫一個Test類,在main函數中輸入如下代碼:
Stringendpoint="伺服器的WebService的地址";
YourWebServiceNameProxyumsp=newYourWebServiceNameProxy(endpoint);
try{
StringresultStr=umsp.opMethod("arg0","arg1");
System.out.println(resultStr);
}catch(Exceptione){
System.out.println("異常");
e.printStackTrace();
}catch(RemoteExceptione){
System.out.println("RemoteException異常");
e.printStackTrace();
}
『叄』 如何在C#中webservice調用方法總結
一、WebService在cs後台程序中的調用
A、通過命名空間和類名直接調用
示例:
WebService ws = 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:ScriptManager runat="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 int AddWwg(int a,int b)
{
return a + b;
}
exe---
using CallWebService.localhost; //因為自己沒有定義命名空間
namespace CallWebService
{
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());
int iResult = serviceWwg.AddWwg(i1, i2);
lb1.Text = iResult.ToString();
}
private void button2_Click(object sender, EventArgs e)
{
CallWebService.localhost.Service serviceWwg = new CallWebService.localhost.Service();
string strResult = serviceWwg.HelloWorld();
lb1.Text = strResult.ToString();
}
}
}
『肆』 C++實現webservice
1 C++當然可以實現webservice,這是毋庸置疑的.axis2你知道嗎?本質是運行在tomcat下的一個servlet,分java版本,和C語言版本.官方網站為:http://axis.apache.org/,首頁上寫著:
The well known Apache Axis, and the the second generation of it, the Apache Axis2, are two Web Service containers that helps users to create, deploy, and run Web Services.
Axis2 is avaialble in both Java as well as C, languages and details about each version can be found below. 大概意思就是這東西分java版本和C版本,可以方便用戶創建,部署,運行web service.而C++完全是兼容C的.
2 當然需要伺服器,可能要實現某個服務吧,至於怎樣為其他平台服務,主要是監聽埠實現解析http協議.
3 你的問題有問題,js不需要拼串成XML,伺服器才要拼串,JS是運行在客戶端的,客戶端也不是通過SOAP與服務端進行通訊的,而是根據需要調用的服務的WSDL,提供對應參數,客戶端與服務端的通訊是用http協議的,而通訊方式根據是GET還是POST把相關參數放到HTTP頭或者體中.而web service之間的通訊才可能用得到SOAP.
4 PHP調用web service是非常簡單的,貌似有個函數通過SOAP調用.C++編寫的web service肯定有WSDL,可以根據WSDL描述的埠參數,來調用.
PS1:我沒有做過C++的Web service,只做過java的,但是所有語言都是相同的,基本原理都是一樣的,另外web service最好的做法是對外隱藏的,不能直接調用,應該有個類似調度中心的存在來負責調用,這是一個設計方式. 當然直接調用也是可以的,但這種方式效率不高.
PS2:C++可以做web service,但不是很好,缺乏技術支持,軟體支持,雖然管道過濾器模型不限制過濾器的實現方式,但怎麼說呢,C++就是不適合,畢竟和其他構件存在配合問題,而且開發成本也會相對要高點. 現在主流的是C#和JAVA.
『伍』 c++如何發布webservice
c+=中使用Axis實現webservice的基本過程:
使用Axis C++開發Web服務的基本過程可以簡單描述如下:
1、使用Java語言描述WEB服務
2、使用Java2WSDL工具生成WSDL文件
3、使用WSDL2Ws工具生成服務端代碼框架
4、編碼實現service,並部署服務
5、使用WSDL2Ws工具生成客戶端代碼框架
6、編碼實現客戶端
三、實例演示
這里以一個簡單的加法Add服務來說明用Axis C++構建webService的過程。
1、使用Java語言描述WEB服務
Axis C++中我們必須先定義好WSDL後方可生成用來實現該服務的代碼框架,這一點與Axis Java不同。生成WSDL方法很多,可以使用Java2WSDL工具,當然也可以手工編寫,這里使用Java2WSDL工具生成。下面我們對Add服務用Java語言描述:
public interface Add{
public int add(int x, int y);
}
只要方法的聲明即可,不需要實現方法,因此我們使用介面來定義。將上面的代碼保存為Add.java。
2、使用Java2WSDL工具生成WSDL文件
javac Add.java (生成.class文件)
java -Djava.ext.dirs=$AXISCPP_HOME/lib/axisjava org.apache.axis.wsdl.Java2WSDL -o Add.wsdl -l"http://localhost/axis/Add" -n"http://localhost/axis/Add" Add
經過上面兩步,我們就可以得到Add.wsdl文件。需要說明的是,生成的WSDL文件有時會有錯(intf都成了impl),這可能是Java2WSDL工具的Bug。如果出現這種情況,可以和Axis C++自帶的例子WSDL文件對比。(註:我花了兩天時間才找出這個問題)
3、使用WSDL2Ws工具生成服務端代碼框架
有上面的WSDL文件,我們可以用WSDL2Ws工具生成服務端構架。
java -Djava.ext.dirs=$AXISCPP_HOME/lib/axisjava -cp $AXISCPP_HOME/lib/axis/wsdl2ws.jar org.apache.axis.wsdl.wsdl2ws.WSDL2Ws Add.wsdl -lc++ -sserver
-s server 表示生成server代碼框架
-l c++ 表示生成C++代碼
4、編碼實現service,並部署服務
上面生成的文件中,我們只需要實現Add.cpp中的add方法即可。
... ...
xsd__int Add::add(xsd__int Value0, xsd__int Value1)
{
return Value0+Value1;
}
... ...
對代碼編譯並鏈接生成.so動態庫:
g++ -shared -I$AXISCPP_HOME/include -o libadd.so *.cpp
對服務進行部署,步驟如下:
(1).將生成的libadd.so文件復制至$AXISCPP_DEPLOY/lib目錄
(2).復制Add.wsdl文件至$AXISCPP_DEPLOY/wsdls目錄
(3).編輯AXISCPP_DEPLOY/etc/server.wsdd文件並在相應位置添加如下內容:
<service name="Add" provider="CPP:RPC" description="Add Service ">
<parameter name="className" value="/apache/axiscpp/lib/libadd.so"/>
<parameter name="allowedMethods" value="add "/>
</service>
(4).重新啟動HTTP服務
(5).檢查http://localhost/axis是不否有新增的Add服務
為了測試我們發布的Web服務是否工作正常,我們下面利用Axis C++來生成調用該服務的客戶端代碼並進行測試。
5、使用WSDL2Ws工具生成客戶端代碼框架
java -Djava.ext.dirs=$AXISCPP_HOME/lib/axisjava -cp $AXISCPP_HOME/lib/axis/wsdl2ws.jar org.apache.axis.wsdl.wsdl2ws.WSDL2Ws Add.wsdl -lc++ -sclient
-s client 表示生成client代碼框架
-l c++ 表示生成C++代碼
6、編碼實現客戶端
上述命令生成了Add.hpp, Add.cpp,我們再編寫客戶端入口程序 AddClient.cpp:
#include "Add.hpp"
#include <stdio.h>
int main(int argc, char** argv)
{
Add ws("http://localhost/axis/Add");
int sum;
if(argc<2)
{
printf("Usage:%s num1 num2\n", argv[0]);
return -1;
}
sum = ws.add(atoi(argv[1]),atoi(argv[2]));
printf("%d\n",sum);
return 0;
}
編譯客戶端,生成可執行文件:
g++ -I$AXISCPP_HOME/include -L$AXISCPP_DEPLOY/lib -laxis_client -ldl -o Add *.cpp
之後,可以用Add命令測試服務工作是否正常。
『陸』 如何用c語言實現基於http的webservice
package com.yun.test;
import java.rmi.RemoteException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.message.PrefixedQName;
import org.apache.axis.message.SOAPHeaderElement;
import com.cezanne.golden.user.Exception;
import com.cezanne.golden.user.UserManagerServiceProxy;
import javax.xml.namespace.QName;
import java.net.MalformedURLException;
import javax.xml.rpc.ServiceException;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPException;
public class testWebService {
public static String getResult() throws ServiceException, MalformedURLException, RemoteException, SOAPException
{
//標識Web Service的具體路徑
String endpoint = "WebService服務地址";
// 創建 Service實例
Service service = new Service();
// 通過Service實例創建Call的實例
Call call = (Call) service.createCall();
//將Web Service的服務路徑加入到call實例之中.
call.setTargetEndpointAddress( new java.net.URL(endpoint) );//為Call設置服務的位置
// 由於需要認證,故需要設置調用的SOAP頭信息。
Name headerName = new PrefixedQName( new QName("發布的wsdl里的targetNamespace里的url", "string_itemName") );
org.apache.axis.message.SOAPHeaderElement header = new SOAPHeaderElement(headerName);
header.addTextNode( "blablabla" );
call.addHeader(header);
// SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement("發布的wsdl里的targetNamespace里的url", "SoapHeader");
// soapHeaderElement.setNamespaceURI("發布的wsdl里的targetNamespace里的url");
// try
// {
// soapHeaderElement.addChildElement("string_itemName").setValue("blablabla");
// }
// catch (SOAPException e)
// {
// e.printStackTrace();
// }
// call.addHeader(soapHeaderElement);
//調用Web Service的方法
org.apache.axis.description.OperationDesc oper;
org.apache.axis.description.ParameterDesc param;
oper = new org.apache.axis.description.OperationDesc();
oper.setName("opName");
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg0"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(", "string"), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg1"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(", "string"), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg2"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(", "string"), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
oper.setReturnType(new javax.xml.namespace.QName(", "string"));
oper.setReturnClass(java.lang.String.class);
oper.setReturnQName(new javax.xml.namespace.QName("", "return"));
oper.setStyle(org.apache.axis.constants.Style.WRAPPED);
oper.setUse(org.apache.axis.constants.Use.LITERAL);
oper.addFault(new org.apache.axis.description.FaultDesc(
new javax.xml.namespace.QName("發布的wsdl里的targetNamespace里的url", "Exception"),
"Exception",
new javax.xml.namespace.QName("發布的wsdl里的targetNamespace里的url", "Exception"),
true
));
call.setOperation( oper );
call.setOperationName(new javax.xml.namespace.QName("發布的wsdl里的targetNamespace里的url", "opName"));
//調用Web Service,傳入參數
String res = ( String ) call.invoke( new Object[]("arg0","arg1"));
System.out.println("===============");
return res;
}
/**
* @param args
*/
public static void main(String[] args) {
try {
System.out.println(getResult());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (ServiceException e) {
e.printStackTrace();
} catch (SOAPException e) {
e.printStackTrace();
}
}
}
『柒』 如何在C++中使用WebService
使用gsoap生成所需的WebService
下載後的gsoap包為:(點擊到我的資源中下載)
將他解壓後,進入到文件夾:gsoap_2.8.18\gsoap-2.8\gsoap\bin\win32
裡面有2個我們要用到的exe,wsdl2h.exe和soapcpp2.exe,如果缺少一個typemap.dat,則從gsoap_2.8.18\gsoap-2.8\gsoap下拷貝進來,最後就可以啟用cmd,開始生成WebService了
我的做法是拷貝一個cmd的快捷方式進來,然後右鍵屬性,把它的「起始位置」設置為F:\webSite\gsoap_2.8.18\gsoap-2.8\gsoap\bin\win32,應用後啟動此快捷方式,那麼操作目錄就為當前目錄了。利用wsdl2h.exe,使用cmd生成WebService的頭文件如下:
wsdl2h -o 頭文件名 WSDL文件名或URL
說明:(注意大小寫)
-o 文件名,指定輸出頭文件名
-n 命名空間前綴 代替默認的ns
-c 產生純C代碼,否則是C++代碼
-s 不要使用STL代碼
-t 文件名,指定type map文件,默認為typemap.dat
-e 禁止為enum成員加上命名空間前綴
這里我生成一個foxwelltech.h頭文件,不使用STL,結果如下:
生成的foxwelltech.h就包含了所有預先寫好的WebService函數介面。從cmd中可以看到該命令需要用到typemap.dat文件,所以如果沒有該文件,會提示找不到文件,需要從別處拷貝過來。接下來,我們按照cmd最後的提示,進行下一步,用soapcpp2.exe來生成可用的.h和.cpp文件:
soapcpp2常用選項:(注意大小寫)
-C 僅生成客戶端代碼
-S 僅生成伺服器端代碼
-L 不要產生soapClientLib.c和soapServerLib.c文件
-c 產生純C代碼,否則是C++代碼(與頭文件有關)
-I 指定import路徑(見上文)
-x 不要產生XML示例文件
-i 生成C++包裝,客戶端為xxxxProxy.h(.cpp),伺服器端為xxxxService.h(.cpp)
如果報錯:Critical error: #import: Cannot open file "stlvector.h"for reading.
Hint: use option -I<path> (you candefine multiple paths separated with ';')
則要使用-I選項指定gSOAP的 import文件路徑
我使用的命令行是:
soapcpp2 -C -x foxwelltech.h -IF:\Website\gsoap_2.8.18\gsoap-2.8\gsoap\import
意為根據foxwelltech.h只生成客戶端代碼,不生成無用的xml文件,另外要引用一個import文件夾,結果如下:
最後的Compilation successful說明了一切,結果就是生成了一個nsmap命名空間文件,二個.h文件,三個.cpp文件
最後,我們新建一個C++的控制台工程來使用它們
注意:
1. 第一步生成的foxwelltech.h不用加進來,直接使用由它生成的後續.h和.cpp即可
2. stdsoap2.h和stdsoap2.cpp來自於路徑:F:\Website\gsoap_2.8.18\gsoap-2.8\gsoap
3. 除nsmap文件外,其他6個都要添加到工程裡面編譯,然後添加測試代碼