GVKun编程网logo

cglib与xstream结合构造webservice的xml格式的入参返参的动态生成(cglib invokesuper)

19

如果您想了解cglib与xstream结合构造webservice的xml格式的入参返参的动态生成的相关知识,那么本文是一篇不可错过的文章,我们将对cglibinvokesuper进行全面详尽的解释,

如果您想了解cglib与xstream结合构造webservice的xml格式的入参返参的动态生成的相关知识,那么本文是一篇不可错过的文章,我们将对cglib invokesuper进行全面详尽的解释,并且为您提供关于2.Silverlight动态加载外部XML指定地址的WebService-(动态加载外部XML文件中指定的WebService地址)、Axis2 WebService输出自定义XML格式、axis2实现webservice之使用services.xml文件发布WebService、c# webservices 自定义返回xml格式的有价值的信息。

本文目录一览:

cglib与xstream结合构造webservice的xml格式的入参返参的动态生成(cglib invokesuper)

cglib与xstream结合构造webservice的xml格式的入参返参的动态生成(cglib invokesuper)

cglib与xstream结合构造webservice的xml格式的入参返参的动态生成

       在做项目的时候遇到这样一个问题,需要与另一个系统进行Webservice通信,通信的入参、返参均是XML格式的,如下:

         <PARAM>
            <DET_FLAG>1</DET_FLAG>
            <IO_TASK_NO>4413051710269522</IO_TASK_NO>
          </PARAM>

       但是这样的接口很多,而且大部分都是简单的几个属性,所以不想为每一种入参和返参都新建一个POJO类,于是就想到用Cglib动态生成类,然后再利用Xstream进行转换。

       首先从网上摘了一段代码,如下:

package com.nari.component.xmlconvertor;

import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import net.sf.cglib.beans.BeanGenerator;
import net.sf.cglib.beans.BeanMap;


public class CglibBean {

	public Object object = null;
	
	
	public BeanMap beanMap = null;
	
	public CglibBean() {     
	      super();     
	}
	
	public CglibBean(Map<String,?> propertyMap) throws Exception {     
		
		
	      this.object = generateBean(propertyMap);     
	      this.beanMap = BeanMap.create(this.object);     
	    }
	
	
	 public void setValue(String property, Object value) {     
	      beanMap.put(property, value);     
	    } 
	 public Object getValue(String property) {     
	      return beanMap.get(property);     
	 }
	 public Object getObject() {     
	      return this.object;     
	    } 
	 
	 
	 private Object generateBean(Map<String,?> propertyMap) throws Exception  {    
	      BeanGenerator generator = new BeanGenerator();    
	      Set<String> keySet = propertyMap.keySet();     
	      for (Iterator<String> i = keySet.iterator(); i.hasNext();) {     
	       String key =  i.next();
	       //修改为获取属性的Class类型 提高兼容性
	       generator.addProperty(key,  propertyMap.get(key).getClass());     
	      }   
	      
	      return generator.create();     
	    }   
	 
	 
	
}

   这段代码就是生成了一个BeanGenerator,没什么好看的,网上一堆一堆的解释,不过将generator.addProperty的参数修改为了propertyMap.get(key).getClass()),以适应自己的需求,而且需要注意的问题是如果是web运行环境,一定要排查下依赖的jar包是否有冲突。

         然后,就是写自己的转换类了,先看下面的代码,这个是将给定的Map转换为XML格式的String

package com.nari.component.xmlconvertor;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

import com.thoughtworks.xstream.XStream;


public class XMLConvertor {

	
public static String convertor(Map<String,?> map,String type) throws Exception {
		
	
		//实例化CglibBean
		CglibBean bean = new CglibBean(map);   
		//为字段赋值,如果不赋值则xml中就没有这个字段
		for(String mapkey : map.keySet()){
			 bean.setValue(mapkey, map.get(mapkey));
			 
			 System.out.println(mapkey + " = " + map.get(mapkey));
			 
			 
		}
		//定制xml格式
		Object object = bean.getObject();
        Class<?> clazz = object.getClass();     
        Field[] fields = clazz.getDeclaredFields();
        XStream x = new XStream();
        
        //修改头为PARAM
        x.alias(type, object.getClass());
        //alias属性为对应的属性名
        for (int i = 0; i < fields.length; i++) {     
            x.aliasField(fields[i].getName().substring(12,fields[i].getName().length()), object.getClass(), fields[i].getName());
        }
		//返回转换好的xml文件
        String xml = x.toXML(object);
        //不知对方接受的xml文件是否要去除空格,如果需要则可使用下面注释掉的方法
        
        //xstream有bug,当参数中含有下划线的时候会转换为双下划线,这里做简单处理
		return xml.replaceAll("__", "_");    
		
	}
	

}

注释都在类里面,需要注意的是一些xstream的alian的问题,仔细看下,没啥东西。

    其次,是将给定的XML格式字符串转换为自己需要的MAP,代码如下:

package com.nari.component.xmlconvertor;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class StringConvertor {

	
	public static Map<String,String> convertor(Map<String,String> map,String xml,String type) throws Exception {
		
		CglibBean bean = new CglibBean(map);
		
		Object obj = bean.getObject();
		
		Class<?> clazz = obj.getClass();     
		
		XStream  xs = new XStream (new DomDriver());
		xs.alias(type, clazz);
		
        Field[] fields = clazz.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {     
        	xs.aliasField(fields[i].getName().substring(12,fields[i].getName().length()), clazz, fields[i].getName());
        }
        
		Object obj2 = (Object)xs.fromXML(xml);
		
		Class<?> clazz2 = obj2.getClass();
		Method[] m3 = clazz2.getDeclaredMethods();
		for(Method method :m3){
        	
        	if(method.getName().indexOf("get")>-1){
        		String methodName = method.getName();
        		System.out.println(methodName);
        		String value = (String)method.invoke(obj2, new Object[0]);
        		String key = methodName.substring(3,methodName.length());
        		map.put(key, value);
        	}
        }
		
		
		return map;
		
		
	}
}

其实就是一个动态类的转换,注意字段的对应关系就行了。

      最后 ,是一个测试类,这里有一些xfire客户端的东西,可以删掉

package com.nari.webservice.client;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

import com.nari.component.xfireclient.XFireClient;
import com.nari.component.xmlconvertor.StringConvertor;
import com.nari.component.xmlconvertor.XMLConvertor;

public class TestClient {

	public static void main(String args[]) throws Exception{

		String IO_TASK_NO = "4413051710269522";
		String DET_FLAG = "1";
		Object[] params = new Object[]{IO_TASK_NO,DET_FLAG};
		
		
		Map<String,String> m = new HashMap<String,String>();
		m.put("IO_TASK_NO", "4413051710269522");
		m.put("DET_FLAG", "1");
		
		String s = "";
		try {
			s = XMLConvertor.convertor(m, "PARAM");
			
			System.out.println(s);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		Map<String,String> ma1 = new HashMap<String,String>();
		ma1.put("IO_TASK_NO", "");
		ma1.put("DET_FLAG", "");
		
		ma1 = StringConvertor.convertor(ma1, s, "PARAM");
		System.out.println(ma1.get("IO_TASK_NO"));
		System.out.println(ma1.get("DET_FLAG"));
        
		XFireClient client = new XFireClient();
		Object[] backXml = client.callService("setInputTask", params);
		
		String backString = (String)backXml[0];
		
		
	}
}
其实,这里的入参和返参都是最基本的XML格式,没有内部属性,没有内部集合,用上面两个工具类足够了,下面的这个测试类提供了对复杂XML格式的动态转换,仅仅作为一个demo,代码如下:
package com.nari.component.xmlconvertor;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.thoughtworks.xstream.XStream;

public class TestXStream {

	public static void main(String args[]) throws Exception{
		
		//collection demo
		List<Object> list = new ArrayList<Object>();
		
		
		
		//不知道什么原因,这里new的虚拟类设置不进去值,可以用下面反射的方法想办法按照一定的规则去赋值,这个是特殊用法,一般不用,这里做兼容性支持
		//原因已经找到,是因为在MAP中使用了关键字,这点估计后台截取的时候会导致类似问题,尽量避免关键字,否则可能需要反射调用,开销很大!!
		for(int iii = 0;iii<2; iii++){
			
			
			Map<String,String> map01 = new HashMap<String,String>();
			map01.put("ASD1", "asd1");
			map01.put("CWE", "asd2");
			map01.put("ASD3", "asd3");
			
			CglibBean innerBean11 = new CglibBean(map01);
			for(String mapkey : map01.keySet()){
				innerBean11.setValue(mapkey, map01.get(mapkey));
			}
			
			Map<String,String> dymaMap = new HashMap<String,String>();
			dymaMap.put("XXXX", "AAS");
			dymaMap.put("WWWW", "ASD");
			dymaMap.put("WEWEW", "dsa");
			CglibBean dymaBean = new CglibBean(dymaMap);
			for(String mapkey : dymaMap.keySet()){
				dymaBean.setValue(mapkey, dymaMap.get(mapkey));
			}
			
			list.add(innerBean11.getObject());
			list.add(dymaBean.getObject());
			
			
			Object objo = dymaBean.getObject();
			Class<?> clazz = objo.getClass();     
	        Field[] testfield = clazz.getDeclaredFields();			
			
	        Method[] m = clazz.getDeclaredMethods();
	        
	        for(Method method :m){
	        	
	        	if(method.getName().indexOf("get")>-1){
	        		String s = (String)method.invoke(objo, new Object[0]);
	        		
	        		System.out.println("从虚拟类中中取出的值为 : " + s);
	        		
	        	}
	        }
	        
		}
		
		
		//内部属性demo
		Map<String,String> map0 = new HashMap<String,String>();
		map0.put("ASD1", "asd1");
		map0.put("ASD2", "asd2");
		map0.put("ASD3", "asd3");
		
		CglibBean innerBean1 = new CglibBean(map0);
		for(String mapkey : map0.keySet()){
			innerBean1.setValue(mapkey, map0.get(mapkey));
		}
		
		
		
		Object innerBean1Obj  = innerBean1.getObject();
		Class<?> clazz3 = innerBean1Obj.getClass();
		 Method[] m3 = clazz3.getDeclaredMethods();
	        
	        for(Method method :m3){
	        	
	        	if(method.getName().indexOf("get")>-1){
	        		String s = (String)method.invoke(innerBean1Obj, new Object[0]);
	        		
	        		System.out.println("22222从虚拟类中中取出的值为 : " + s);
	        		
	        	}
	        }
		
		
		//原始
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("TEST1", "testValue1");
		map.put("TEST2", "testValue2");
		map.put("TEST3", innerBean1.getObject());
		map.put("TEST4", list);
		
		CglibBean bean = new CglibBean(map);  
		for(String mapkey : map.keySet()){
			 bean.setValue(mapkey, map.get(mapkey));
		}
		
		Object object = bean.getObject();
		
		XStream xstream = new XStream();
		Class<?> clazz = object.getClass();     
        Field[] fields = clazz.getDeclaredFields();
		
		//别名
		xstream.alias("ROOT", clazz);
		
		  for (int i = 0; i < fields.length; i++) {  
			  
			  //简化的别名
			  String aliasName = fields[i].getName().substring(12,fields[i].getName().length());
			  xstream.aliasField(aliasName, object.getClass(), fields[i].getName());
			  //如果不是String类型的则表明是Object的具体对象
			  
			  
			  //如果是List
			  if(bean.getValue(aliasName) instanceof ArrayList){
				  
				  xstream.addImplicitCollection(clazz, fields[i].getName());
				  
				  ArrayList arraylist = (ArrayList)bean.getValue(aliasName);
				  
				
				  for(Object objectBean : arraylist){
					  
					  Class<?> clazzList = objectBean.getClass();     
				      Field[] fieldsList = clazzList.getDeclaredFields();
				      
				      xstream.alias(aliasName, clazzList);
				      
				      Method[] methods = clazzList.getDeclaredMethods();
				      
				      for(Method m : methods){
				    	  
				    	  if(m.getName().indexOf("set")>-1){
				    		  
//				    		  m.invoke(objectBean, new Object[]{"tt!!!"});
				    		  
				    	  }
				    	  
				    	  
				    	  
				    	  
				      }
				      
				      for (int j = 0; j < fieldsList.length; j++) {  
						  
//				    	  String s = fieldsList[j].getName() ;
				    	  
				    	  String aliasNameInner1 = fieldsList[j].getName().substring(12,fieldsList[j].getName().length());
						  
						  xstream.aliasField(aliasNameInner1, clazzList, fieldsList[j].getName());
						  
						  xstream.useAttributeFor(clazzList,fieldsList[j].getName());
						  
				      }
				  }
				  
				  
				  
				  System.out.println(aliasName + " 是List");
			  }
			  //如果是String
			  else if(bean.getValue(aliasName) instanceof String){
				  
				  System.out.println(aliasName + " 是String");
			  }
			  //如果是内部类
			  else {
				  System.out.println(aliasName + " 是单独的类");
				  Class<?> clazzInner = bean.getValue(aliasName).getClass();     
			      Field[] fieldsInner = clazzInner.getDeclaredFields();
			      
			      for (int ii = 0; ii < fieldsInner.length; ii++) {  
					  
			    	  String aliasNameInner = fieldsInner[ii].getName().substring(12,fieldsInner[ii].getName().length());
					  
					  xstream.aliasField(aliasNameInner, clazzInner, fieldsInner[ii].getName());
					  
					  xstream.useAttributeFor(clazzInner,fieldsInner[ii].getName());
					  
			      }
			  }
			  
			  
			  
				  xstream.useAttributeFor(object.getClass(),fields[i].getName());
			 
		  }
		
		
		System.out.println(xstream.toXML(object));
		
		
	}
	
	
}

引入上面相关类后可以直接运行,运行结果如下:

<ROOT TEST1="testValue1" TEST2="testValue2">
  <TEST3 ASD2="asd2" ASD3="asd3" ASD1="asd1"/>
  <TEST4 ASD3="asd3" ASD1="asd1" CWE="asd2"/>
  <TEST4 WEWEW="dsa" WWWW="ASD" XXXX="AAS"/>
  <TEST4 ASD3="asd3" ASD1="asd1" CWE="asd2"/>
  <TEST4 WEWEW="dsa" WWWW="ASD" XXXX="AAS"/>
</ROOT>

     对于复杂XML转换为动态对象的工具类暂时没有写,以后补上

2.Silverlight动态加载外部XML指定地址的WebService-(动态加载外部XML文件中指定的WebService地址)

2.Silverlight动态加载外部XML指定地址的WebService-(动态加载外部XML文件中指定的WebService地址)

接上节所讲的,Silverlight可以加载外部的XML文件里面的内容,那么我们可不可以在外部XML里面配置一个WebService地址,并且以 此加载这个地址来动态加载WebService呢?这样子就可以避免当WebService地址改变的时候,还要打开XAP包来重新修改 WebService配置的地址了。

    答案当然是可以的。在这里,我制作了一个实例。

    在前面一节里面,我们讲到了使用WebClient来下载Silverlight程序外部的XML文件内容。在本节中,我们重点需要讲解一下如何使用反射来动态生成WebService代理类。关键代码如下:

 

 
 
  1. public void InitializeServices(string serviceAddress) 
  2.       { 
  3.           BasicHttpBinding basicBinding = new BasicHttpBinding();//创建BasicHttpBinding绑定类 
  4.           basicBinding.MaxBufferSize = 2147483647;//设置最大缓存字节 
  5.           basicBinding.MaxReceivedMessageSize = 2147483647;//设置最大的接受消息缓存字节 
  6.           CustomBinding binding = new CustomBinding(basicBinding); 
  7.   
  8.           BindingElement binaryElement = new BinaryMessageEncodingBindingElement(); 
  9.   
  10.           EndpointAddress endPoint = new EndpointAddress(serviceAddress);//根据读取的外部XML指定的Webservice地址来实例化终结点地址。 
  11.   
  12.           WebServiceSoapClient _LBControl = new WebServiceSoapClient();//实例化WebService代理类 
  13.           _LBControl = (WebServiceSoapClient)Activator.CreateInstance(typeof(WebServiceSoapClient), binding, endPoint);//使用反射来实例化我们需要指定的webService地址 

      当然以上只是关键性代码,我们在实践中还需要自己写一个WebService做测试,在本实例源代码程序中,我们在SLreadxml.Web项目中新建了一个WebService.asmx页面,此页面写了一个简单的WebService方法:

    
    
  1. [WebMethod] 
  2.        public string HelloWorld() 
  3.        { 
  4.            return "Hello World For TestData"
  5.        } 

然后我们右键点击SLreadxml项目名然后选择“添加服务引用”,在弹出的窗口中,我填入SLreadxml.Web中 WebService.asmx页面的http地址。(注意这里的Http以你自己的WebService地址为准,你可以重新架设一个网站目录或者IP 上。)http://localhost:1239/webService.asmx,然后点击“前进”,在这里创建好这个服务引用的代理类。并且命名此命名空间名为LBControl,然后我们需要在App.xaml.cs文件中引入以下命名空间:

    
    
  1. using System.IO; 
  2. using System.Xml; 
  3. using System.Windows.browser; 
  4. using System.ServiceModel; 
  5. using System.ServiceModel.Channels; 
  6. using SLreadxml.LBControl; 

当然System.ServiceModel域名空间还需要单独引用其DLL文件。在SLreadxml右键--“添加引用”。

另外想要WebService能够被访问到,还需要添加clientaccesspolicy.xml文件,此文件叙述了你可以安全的引用某一个网 站下的WebService.类似于安全许可吧。值得注意的是这个文件必须放在你的网站的根目录下面,那么你的这个WebService文件才能够被访问 到。不是虚拟目录的根目录,而是你网站的根目录。切记。

clientaccesspolicy.xml源代码:

    
    
  1. <?xml version="1.0" encoding="utf-8" ?> 
  2. <access-policy> 
  3.   <cross-domain-access> 
  4.     <policy> 
  5.       <allow-from http-request-headers="*"> 
  6.         <domain uri="*"/> 
  7.       </allow-from> 
  8.       <grant-to> 
  9.         <resource path="/" include-subpaths="true"/> 
  10.       </grant-to> 
  11.     </policy> 
  12.   </cross-domain-access> 
  13. </access-policy> 

     好了。现在基本上已经可以实现动态的访问XML来动态的读取WebService地址。而不用每次都要去XAP包里面修改WebService地址了。那样太麻烦了。

最后给出Config.xml的源代码:

    
    
  1. <configuration> 
  2.     <TestData>http://localhost:1239/webService.asmx</TestData> 
  3.     <SecData>Secend Test Data</SecData> 
  4. </configuration> 

      本实例的源代码如下,点击请下载:SLReadXMLForWebService.rar 。

Axis2 WebService输出自定义XML格式

Axis2 WebService输出自定义XML格式

在使用AXIS2 WebService做WebService时,想要自己返回自己XML格式,搜索了下,没发现可以有demo的,然后查找AXIS2.war和AXIS2.zip没有相关demo,求助!!

PS:如OSC中返回http://www.oschina.net/action/api/news_list就是自定义的XML。

axis2实现webservice之使用services.xml文件发布WebService

axis2实现webservice之使用services.xml文件发布WebService

       还是对教程的延伸,本来是周五要写的,但是耽搁了一下,就拖到周一了。

      Axis2实现Web Service,虽然可以将POJO类放在axis2\WEB-INF\pojo目录中直接发布成Web Service,这样做不需要进行任何配置,但这些POJO类不能在任何包中。这似乎有些不方便,为此,Axis2也允许将带包的POJO类发布成Web Service
   
先实现一个POJO类,代码如下: 

package service; public class MyService { public String getGreeting(String name) { return "您好 " + name; } public void update(String data) { System.out.println("<" + data + ">已经更新"); } }

这个类有两个方法,这两个方法都需要发布成Web Service方法。这种方式和直接放在pojo目录中的POJO类不同。要想将MyService类发布成Web Service,需要一个services.xml文件,这个文件需要放在meta-inf目录中,该文件的内容如下:

<service name="myService"> <description> Web Service例子 </description> <parameter name="ServiceClass"> service.MyService </parameter> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"https://www.jb51.cc/tag/cme/" target="_blank">cmessageReceiver" /> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"/> </messageReceivers> </service>

其中<service>元素用于发布Web Service,一个<service>元素只能发布一个WebService类,name属性表示WebService名,如下面的URL可以获得这个WebServiceWSDL内容:

http://localhost:8080/axis2/services/myService?wsdl (这个得等到.aar文件出来之后)

其中name属性名就是上面URL"?""/"之间的部分。

<description>元素表示当前Web Service的描述,<parameter>元素用于设置WebService的参数,在这里用于设置WebService对应的类名。在这里最值得注意的是<messageReceivers>元素,该元素用于设置处理WebService方法的处理器。例如,getGreeting方法有一个返回值,因此,需要使用可处理输入输出的RPcmessageReceiver类,而update方法没有返回值,因此,需要使用只能处理输入的RPCInOnlyMessageReceiver类。

使用这种方式发布WebService,必须打包成.aar文件,..aar文件实际上就是改变了扩展名的.jar文件。在现在建立了两个文件(这两个文件夹任意):MyService.javaservices.xml。将MyService.java编译,生成MyService.classservices.xmlMyService.class文件的位置如下:

D:\ws\service\MyService.class

D:\ws\meta-inf\services.xml

   
 windows控制台中进入ws目录,并输入如下的命令生成.aar文件(实际上,.jar文件也可以发布webservice,但axis2官方文档中建议使用.aar文件发布webservice):

jar cvf ws.aar .    jar cvf AxisTest.aar .

    如下是我测试的过程

        原来发现不管要.aar,之后还需要一个“.”,即.arr.,但是最坑爹的就是这里了,加了“.”之后还是不对啊,最后的问题居然是这个后面的点要空一格,不能紧挨着.arr


      如下成功之后的文件夹情况


    最后将ws.aar文件复制到<Tomcat安装目录>\webapps\axis2\WEB-INF\services目录中,启动Tomcat后,就可以调用这个WebService了。

      已经显示webservice发布成功了,接下来就是编写客户端进行调运了,跟前面一样,也需要wsdl2java命令去生成stub类,过程我就不多说了,之前的博客里有

如下是调用客户端的代码

package service; import org.apache.axis2.AxisFault; public class MyServiceStubClient { public static void main(String[] args) { // Todo Auto-generated method stub try { MyServiceStub mss = new MyServiceStub(); MyServiceStub.GetGreeting gg = new MyServiceStub.GetGreeting(); MyServiceStub.Update up = new MyServiceStub.Update(); gg.setName("美女"); up.setData("帅哥"); try { mss.update(up); System.out.println("美女"+mss.getGreeting(gg).get_return()); } catch (Exception e) { // Todo Auto-generated catch block e.printstacktrace(); System.out.println("发生异常"); } } catch (AxisFault e) { // Todo Auto-generated catch block e.printstacktrace(); } } }


运行结果

由于“帅哥”是在服务器端打印的,所以客户端是看不到的。

在打包arr文件的时候,发现有一个build.xml文件,这个是ant脚本中的知识,在本题中暂时不涉及,以后再介绍。

 

如果想发布多个WebService,可以使用<serviceGroup>元素,如再建立一个MyService1类,代码如下:

package service public class MyService1 { public String getName() { return "bill"; } }


services.xml文件中可以使用如下的配置代码来配置MyServiceMyService1类:

<serviceGroup> <service name="myService"> <description> Web Service例子 </description> <parameter name="ServiceClass"> service.MyService </parameter> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"https://www.jb51.cc/tag/cme/" target="_blank">cmessageReceiver" /> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"/> </messageReceivers> </service> <service name="myService1"> <description> Web Service例子 </description> <parameter name="ServiceClass"> service.MyService1 </parameter> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"https://www.jb51.cc/tag/cme/" target="_blank">cmessageReceiver" /> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"/> </messageReceivers> </service> </serviceGroup>

c# webservices 自定义返回xml格式

c# webservices 自定义返回xml格式

c# 编写webservices时怎么返回自定义xml格式,而不是用它默认的个格式。

    怎么自定义标签名?

今天的关于cglib与xstream结合构造webservice的xml格式的入参返参的动态生成cglib invokesuper的分享已经结束,谢谢您的关注,如果想了解更多关于2.Silverlight动态加载外部XML指定地址的WebService-(动态加载外部XML文件中指定的WebService地址)、Axis2 WebService输出自定义XML格式、axis2实现webservice之使用services.xml文件发布WebService、c# webservices 自定义返回xml格式的相关知识,请在本站进行查询。

本文标签:

上一篇web压力测试,本机压的结果和内网机压的结果qps差不多,但是php进程使用度却不一样?

下一篇【转】使用 Spring 3 MVC HttpMessageConverter 功能构建 RESTful web 服务(spring mvc service)