`
caiying0504
  • 浏览: 334961 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java调用.net webservice 返回图片

阅读更多
由于没学习过.net,最近程序中需要调用.net的webservice接口得到一张图片。在网上找了好多资料选用的axis来实现调用。
首先看看.net实现Webmehod的两种方式,这两种方式java传参数的方式也有不同
1.rpc方式:
using System;   
using System.Collections;   
using System.ComponentModel;   
using System.Data;   
using System.Linq;   
using System.Web;   
using System.Web.Services;   
using System.Web.Services.Protocols;   
using System.Xml.Linq;   
  
namespace WebService1   
{       
       
    [WebService(Namespace = "http://tempuri.org/")]   
    public class Service1 : System.Web.Services.WebService   
    {   
  
        [WebMethod]   
        [SoapRpcMethod(Action = "http://tempuri.org/hello", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/")]   
  
        public string hello(String s)   
        {   
            return "Hello,"+s;   
        }   
    }   
}  


2.Document方式:
namespace WebService1   
{       
       
    [WebService(Namespace = "http://tempuri.org/")]   
    public class Service1 : System.Web.Services.WebService   
    {   
  
        [WebMethod]           
        public string hello(String s)   
        {   
            return "Hello,"+s;   
        }   
    }   
}  







下面是java调用的代码
package com.ctitc.analysis.util;

import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import java.util.Date;

import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;

import sun.misc.BASE64Decoder;

import com.ctitc.analysis.pojo.GisChartInfo;


/*
 * 调用.net的webservice方法获取gis生成的图片地址
 * 
 * */
public class GetWebService {
	
	 public String getWebService(String imagePath,GisChartInfo gisChartInfo) {     
			String picUrl = "";	        
	        try {
	        	// WebService URL 
	        	String url = "http://192.168.5.92/JttMapService/Service.asmx";
	        	String namespace = "http://www.fzkcy.com/";
	        	String method = "WebChartNew";
	        	
	        	//创建调用服务
	        	Service service = new Service();
	            Call call = (Call) service.createCall();           
	            call.setTargetEndpointAddress(new java.net.URL(url));
	            /*如果.net在提供Rpc服务时设置成 
[SoapRpcMethod(Action = "",.....
  则不需要再设置call.setUseSOAPAction和call.setSOAPActionURI*/


            call.setUseSOAPAction(true);
            call.setSOAPActionURI("http://www.fzkcy.com/WebChartNew");
           
            // 设置要调用的方法
            call.setOperationName(new QName(namespace, method)); 
           
            // 该方法需要的参数
           
            call.addParameter(new QName(namespace,"layername"),XMLType.XSD_STRING,ParameterMode.IN);
            call.addParameter(new QName(namespace,"width"),XMLType.XSD_INT,ParameterMode.IN);
            call.addParameter(new QName(namespace,"height"),XMLType.XSD_INT,ParameterMode.IN);
            call.addParameter(new QName(namespace,"imageType"),XMLType.XSD_STRING,ParameterMode.IN);
            call.addParameter(new QName(namespace,"fieldnames"),XMLType.XSD_STRING,ParameterMode.IN);
            call.addParameter(new QName(namespace,"fieldvalues"),XMLType.XSD_STRING,ParameterMode.IN);
            call.addParameter(new QName(namespace,"rgbcolors"),XMLType.XSD_STRING,ParameterMode.IN);
            call.addParameter(new QName(namespace,"chartType"),XMLType.XSD_STRING,ParameterMode.IN);
            call.addParameter(new QName(namespace,"size"),XMLType.XSD_STRING,ParameterMode.IN); 
//以下传参数方式为 Rpc方式
            //             call.addParameter("layername",XMLType.XSD_STRING,ParameterMode.IN);              
//             call.addParameter("width",XMLType.XSD_INT,ParameterMode.IN);
//             call.addParameter("height",XMLType.XSD_INT,ParameterMode.IN);
//             call.addParameter("imageType",XMLType.XSD_STRING,ParameterMode.IN);
//             call.addParameter("fieldnames",XMLType.XSD_STRING,ParameterMode.IN);
//             call.addParameter("fieldvalues",XMLType.XSD_STRING,ParameterMode.IN);
//             call.addParameter("rgbcolors",XMLType.XSD_STRING,ParameterMode.IN);
//             call.addParameter("chartType",XMLType.XSD_STRING,ParameterMode.IN);
//             call.addParameter("size",XMLType.XSD_STRING,ParameterMode.IN);
            // 方法的返回值类型            
            call.setReturnType(XMLType.XSD_STRING);
                               
            //设置参数
            String layername = gisChartInfo.getLayername();
        int width = gisChartInfo.getWidth();
        int height = gisChartInfo.getHeight();
        String imageType = gisChartInfo.getImageType();
        String fieldnames = gisChartInfo.getFieldnames();
        String fieldvalues = gisChartInfo.getFieldvalues();
        String rgbcolors = gisChartInfo.getRgbcolors();
        String chartType = gisChartInfo.getChartType();
        String size = gisChartInfo.getSize();
       
        Object[] parameters = new Object[]{layername,width+"",height+"",imageType,fieldnames,fieldvalues,rgbcolors,chartType,size};        
        // 调用该方法
        byte[] imageBytes ;
        BASE64Decoder dec=new BASE64Decoder();
        imageBytes = dec.decodeBuffer(call.invoke(parameters).toString());
        System.out.println(imageBytes);
            //在指定位置生成图片
            Date date = new Date();
            picUrl = imagePath+date.getTime()+"."+gisChartInfo.getImageType();  
FileOutputStream out = new FileOutputStream(picUrl);
System.out.println(imageBytes.length);
out.write(imageBytes ,0,imageBytes.length);   
out.flush();
out.close();
        } catch (RemoteException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (MalformedURLException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }catch (ServiceException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();
        }catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
        }
      
        return picUrl;  
    } 

public static void main(String args[]){
GisChartInfo gisChartInfo = new GisChartInfo();
gisChartInfo.setLayername("地市行政区划");
gisChartInfo.setWidth(800);
gisChartInfo.setHeight(800);
gisChartInfo.setImageType("JPG");
gisChartInfo.setFieldnames("行政区划代码,县道,乡道,村道,专用道路");
gisChartInfo.setFieldvalues("3501,1791.561,2327.151,4659.821,9.656;" +
"3502,493.664,665.151,405.498,0;" +
"3503,676.446,981.887,3266.88,3.095;" +
"3504,1846.326,6357.708,3388.415,0;" +
"3505,1966.458,6469.783,4600.375,1.461;" +
"3506,1692.84,3526.773,3656.503,0;" +
"3507,1541.45,6636.189,3572.128,99.667;" +
"3508,1797.244,6723.257,1750.648,296.853;" +
"3509,1725.352,1903.754,4550.091,58.943");
gisChartInfo.setRgbcolors("0,92,230;132,0,128;56,168,0;255,128,0");
gisChartInfo.setChartType("BAR");
gisChartInfo.setSize("30,10");
System.out.println(new GetWebService().getWebService("d:/GisPictures/", gisChartInfo));

}


}



下面是接口描述文档
POST /JttMapService/Service.asmx HTTP/1.1
Host: 192.168.5.92
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.fzkcy.com/WebChartNew"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <WebChartNew xmlns="http://www.fzkcy.com/">
      <layername>string</layername>
      <width>int</width>
      <height>int</height>
      <imageType>string</imageType>
      <fieldnames>string</fieldnames>
      <fieldvalues>string</fieldvalues>
      <rgbcolors>string</rgbcolors>
      <chartType>string</chartType>
      <size>string</size>
    </WebChartNew>
  </soap:Body>
</soap:Envelope>
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <WebChartNewResponse xmlns="http://www.fzkcy.com/">
      <WebChartNewResult>base64Binary</WebChartNewResult>
    </WebChartNewResponse>
  </soap:Body>
</soap:Envelope>




其中需要注意的是java在接受.net的webservice方法返回的是经过base64编码方式编码过的字符串,接收时需要将它转换为byte[]再生成图片。
还有一点我没搞明白的,也困扰我很久的就是.net的接口描述文档中的参数width和height是int类型,当我传入int类型时服务器会报错:Server was unable to read request。就是服务器无法读取请求。最后通过把这两个值转换为String类型传入解决问题,但原因还没搞清楚,希望那位是过来人的仁兄留言解释一下,不胜感激!
分享到:
评论
1 楼 kxhu 2009-07-10  
good 解决了我的问题!

相关推荐

Global site tag (gtag.js) - Google Analytics