`
caiying0504
  • 浏览: 341668 次
  • 性别: 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 解决了我的问题!

相关推荐

    android上传图片到.net webservice

    7. **处理响应**:根据WebService返回的结果进行相应的业务处理。 以上就是Android上传图片到.NET WebService的基本流程。在实际应用中,可能还需要考虑错误处理、网络连接状态检查、异步处理以避免阻塞UI线程等...

    webserver示例

    【文件名称列表】中包含的文件主要关于ASP.NET WebService的开发和使用,包括跨平台调用的示例和图片验证码服务的开发,这些都是Web服务应用的重要组成部分。 1. **ASP.NET WebService**:ASP.NET WebService是微软...

    webservice上传图片到服务器

    在这个场景中,我们将使用`KSOAP2`库来调用`webservice`,实现从Android设备上传图片到服务器的功能。以下是关于这个主题的详细解释。 ### 1. `KSOAP2`简介 `KSOAP2`是Android平台上一个轻量级的、用于调用SOAP...

    android 异步封装调用Webservice

    C# Webservice是一种基于.NET框架的服务,可以通过SOAP协议与其他平台(如Android)进行通信。 首先,理解异步调用的概念至关重要。在Android中,由于UI线程不能执行耗时操作,否则会导致应用无响应(ANR)错误。...

    五分钟用Flex构建WebService应用

    例如,你可以将XML数据绑定到列表组件,当WebService返回新的数据时,列表会自动更新。 在提供的压缩文件中,"五分钟用Flex构建WebService应用—Flash教程.htm"可能是教程的详细内容,包含了具体步骤和示例代码。而...

    webservice用于上传文件

    如果这是一个完整的项目,那么它可能包括服务端代码(如Java的JAX-WS或.NET的ASMX)、客户端示例代码、以及可能的数据库连接和数据处理逻辑。 在实际开发中,使用WebService上传文件时,还需要考虑以下几点: 1. ...

    复杂邮件程序完整Java源码,支持添加附件,图片,HTML格式文本,支持远程WebService调用

    复杂邮件程序完整Java源码,支持添加附件,图片,HTML格式文本,支持远程WebService调用*/ package com.hx.mail; import java.io.File; import java.util.Map; import javax.mail.Message.RecipientType; /** * ...

    ajax+WebService应用实例

    同时,对于WebService,可能会使用.NET、Java、Python等语言的框架,如ASP.NET的ASMX或WCF服务,或者是PHP的SOAP库来创建和部署服务。 在"AjaxServer"这个文件或目录中,可能包含了以下内容: 1. HTML文件:展示...

    适合初学者android webservice交互,webservice通过c#编译

    压缩包中的资源包括两张图片,可能展示了Android应用界面或Web Service的调用示例,以及两个rar文件——"android.rar"和"webservice.rar"。这两个压缩文件可能包含源代码示例,帮助初学者更好地理解如何实现Android...

    webservice-soap资料

    在实际开发中,通常会使用如Java的JAX-WS、.NET的ASMX或WCF等框架来简化SOAP的使用,它们自动生成符合SOAP规范的客户端和服务端代码。 总之,这份“webservice-soap资料”对于想要深入理解Web服务和SOAP协议的人来...

    android webservice 客户端、服务端实例

    Web Service服务端可以使用多种技术实现,如PHP、Java的Spring Boot、ASP.NET等。这里我们主要讨论Java环境下的实现。 1. **SOAP与RESTful API**: 两种常见的Web Service协议。SOAP是基于XML的,结构严谨但复杂;...

    Android上传图片

    本文将详细介绍如何使用`Ksoap2`在Android中连接`WebService`并上传图片。 首先,理解`SOAP`协议至关重要。`SOAP`是一种简单的基于XML的协议,用于在分布式环境中交换结构化和类型化的信息。`WebService`是基于`...

    iflex4视频教程 代码PicWatcher实例代码

    当HTTPService请求返回结果时,`loadImage`方法会被调用,将返回的图片数据赋值给`imageData`。 最后,优化图片加载和显示性能也是PicWatcher实例的重要部分。IFlex4提供了缓存机制,可以将加载过的图片保存在本地...

    android 利用ksoap2制作天气预报,绝对原创

    在`MainActivity.java`中,创建一个方法来调用这个服务,如下所示: ```java private void getWeatherInfo(String city) { // 设置SOAP请求的URL和方法名 String url = ...

Global site tag (gtag.js) - Google Analytics