zoukankan      html  css  js  c++  java
  • Java与.NET的WebServices相互调用

    一:简介
    本文介绍了Java与.NET开发的Web Services相互调用的技术。本文包括两个部分,第一部分介绍了如何用.NET做客户端调用Java写的Web Services,第二部分介绍了如何用Java做客户端调用.NET开发的Web Services。  
    二:项目需要的工具  
    WindowsXP Professial(IIS)
    Eclipse3.1(已装好Tomcat axis)
    VS.Net 2003
    备注:下载安装Tomcat5.5.16 以及 Axis的开发包,并做相应配置。看我前一片文档。
    三:用.NET做客户端调用Java写的Web Services
    1.生成一个Java Web Services
    使用Eclipse生成一个Web Services是非常简单的。新建一个Web工程,右键建立一个Class,名为HelloClient.java。代码如下:
    java 代码
    1. public class HelloClient   
    2. {   
    3. public String getName(String name)   
    4. {   
    5. return "Hello,"+name;   
    6. }   
    7. }  

         右键此文件选择"WebServices"-->"Create Web Service"即可部署为本机的一个ws。在IE浏览器中输入http://localhost:8008/testWebService/services/HelloClient可以看到已经部署了的HelloClient服务。输入http://localhost:8008/testWebService/services/HelloClient?wsdl这个服务的描述文件。

         新建一个项目(WinForm,ASP.net都可以),我在这里使用的是一个Asp.Net项目。在起始页面上放置一个文本输入框用来输入,一个标签用来显示调用Web Services的结果,放置一个按钮,用来单击调用Web Services。然后,选择添加Web 引用,URL一栏里填入http://localhost:8008/testWebService/services/HelloClient?wsdl,Web 引用的名称输入JavaWebService,单击添加引用按钮就可以了。此时,我们可以在VS.net 的Solution Explore中看到这个Web 引用。
    添加代码如下:

    c# 代码
    1. protected System.Web.UI.WebControls.TextBox txtName;   
    2. protected System.Web.UI.WebControls.Button btnSend;   
    3. protected System.Web.UI.WebControls.Label lblMsg;   
    4.   
    5. private JavaWebService.HelloClientService ws;   
    6. private void Page_Load(object sender, System.EventArgs e)   
    7. {   
    8. // 在此处放置用户代码以初始化页面   
    9. ws=new testWebService.JavaWebService.HelloClientService();   
    10. }   
    11.   
    12. private void btnSend_Click(object sender, System.EventArgs e)   
    13. {   
    14. lblMsg.Text=ws.getName(txtName.Text);   
    15. }  

    这样,一个.NET客户端就完成了,测试一下,工作正常,OK.

    四:用Java做客户端调用.NET写的 Web Services

    1. 用VS.NET新建一个Asp Web Services工程,添加一个web 服务,命名为Service1.asmx。新增一个web method,代码如下:

    c# 代码
    1. //指定SoapAction   
    2. [SoapRpcMethod(Action="http://www.zjh.com/Rpc",RequestNamespace="http://www.zjh.com/SU",ResponseNamespace="http://www.zjh.com/SU")]   
    3. [WebMethod]   
    4. public string getName(string name)   
    5. {   
    6. return "Hello"+name;   
    7. }  

    然后运行它,并利用IE进行测试成功。

    2. 打开Eclipse,新建一个Web项目,添加一个JSP页面 ,命名为action_hello.jsp,输入下列代码:

    java 代码
    1. <%@page pageEncoding="GBK" contentType="text/html; charset=GBK" %>   
    2. <%@page import="org.apache.axis.client.Call"%>   
    3. <%@page import="org.apache.axis.client.Service"%>   
    4. <%@page import="javax.xml.namespace.QName"%>   
    java 代码
    1. <%   
    2. request.setCharacterEncoding("GBK");   
    3. String name=request.getParameter("name");   
    4. String endpoint="http://localhost/HelloClient/Service1.asmx";   
    5. Service service = new Service();   
    6. Call call = (Call)service.createCall();   
    7. call.setTargetEndpointAddress(new java.net.URL(endpoint));   
    8. call.setOperationName(new QName("http://www.zjh.com/SU","getName"));   
    9. call.addParameter("name",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN);   
    10. call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);   
    11. call.setUseSOAPAction(true);   
    12. call.setSOAPActionURI("http://www.zjh.com/Rpc");   
    13. String res =(String)call.invoke(new Object[]{name});   
    14. out.print(res);   
    15. %>   

    这个要比Java调用Java写的ws来的复杂。ws和Java客户端都要设置SOAPAction,否则会有异常说 System.Web.Services.Protocols.SoapException: 服务器未能识别 HTTP 标头 SOAPAction 的值


    五:总结
    经过两天的试验,终于从技术上明确了通过Web Services实现.net 与 java的互通是可能的。当然有几点是需要注意的:

      1. 在提供Web Services的时候,尽量使用xml schema中支持的变量类型做参数。如果使用.net 中的dataset这种类型,对于java来说解析起来将是一个灾难,当然,理论上是可以解析的。但是从效率角度来说,在Web Services与客户端交换信息的过程中,始终有一个序列化和反序列化的问题。如果使用dataset这种类型,系统还需要对它进行序列化操作,这将是一个很耗费资源的过程。而使用string类型将简单很多。

      2. 如果使用了soap header等扩展功能,例如使用了微软提供的WSE技术,它们之间的相互通信需要作特殊处理。可以看我下一篇文章。

  • 相关阅读:
    Python range() 函数用法
    substr
    disable enable 所有其他表关联的外键
    sql with multiply where
    小米开源文件管理器MiCodeFileExplorer-源码研究(7)-Favorite收藏管理和SQLite数据库CRUD
    Centos安装FastDFS+Nginx(一天时间搞定)
    Centos安装FastDFS+Nginx(一天时间搞定)
    小米开源文件管理器MiCodeFileExplorer-源码研究(6)-媒体文件MediaFile和文件类型MimeUtils
    小米开源文件管理器MiCodeFileExplorer-源码研究(6)-媒体文件MediaFile和文件类型MimeUtils
    小米开源文件管理器MiCodeFileExplorer-源码研究(5)-AsyncTask异步任务
  • 原文地址:https://www.cnblogs.com/lzhdim/p/1359308.html
Copyright © 2011-2022 走看看