潮汗的中医解释:Java调用.net的WebService - 阿善的日志 - 网易博客

来源:百度文库 编辑:偶看新闻 时间:2024/04/19 22:42:17

这几天公司需要做一个java和.net项目的整合,其中.net做了一个WebService,需要java来调用。本以为很容易的一个东西,结果弄了几天才弄好。

最开始.net的Service代码如下(黄色背景是自己增加的代码):

//<%@ WebService Language="C#" Class="Service" Debug=true %>
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

namespace Service
{
 [WebService(Namespace="http://192.168.168.180/ss/Service.asmx")]

 ///


 /// Service1 的摘要说明。
 ///

 public class Service : System.Web.Services.WebService
 {
  public Service()
  {
   //CODEGEN: 该调用是 ASP.NET Web 服务设计器所必需的
   InitializeComponent();
  }

  #region 组件设计器生成的代码
  
  //Web 服务设计器所必需的
  private IContainer components = null;
    
  ///


  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  ///

  private void InitializeComponent()
  {

  }

  ///


  /// 清理所有正在使用的资源。
  ///

  protected override void Dispose( bool disposing )
  {
   if(disposing && components != null)
   {
    components.Dispose();
   }
   base.Dispose(disposing);  
  }
  
  #endregion

  [WebMethod(Description="test")]
  public string GetTestQuestions(string TeacherName,string Subject)
  {
   return "11111";
  }

 }
}
=================

Java调用代码:

 public static String GetTestQuestions(String TeacherName,String Subject){
  String result = "";
  try{
   Service service = new Service();
   Call call = (Call) service.createCall();
   call.setOperationName(new QName("", "GetTestQuestions"));
   call.addParameter("TeacherName", XMLType.XSD_STRING, ParameterMode.IN);
   call.addParameter("Subject", XMLType.XSD_STRING, ParameterMode.IN);
   call.setTargetEndpointAddress(new URL(
       "http://192.168.168.180/ss/Service.asmx"));    
   result  = (String) call.invoke(new Object[] { TeacherName, Subject});   
   
  }catch(Exception e){
   e.printStackTrace();
  }
  
  return result;
 }
 public static void main(String args[]){
  System.out.println(UserWebService.GetTestQuestions("aaa", "HOMA060E"));

 }
--------------------

结果用java调用时总提示:faultString: 服务器未能识别 HTTP 标头 SOAPAction 的值:。
--------------------

上网找了解决方法,最好修改的结果如下:

.net WebService代码:

在webservicenamespace后面增加:

[SoapDocumentService(RoutingStyle=SoapServiceRoutingStyle.RequestElement)]

java调用错误变成了:faultString: 无法识别请求元素 <GetTestQuestions xmlns=''>。

崩溃了……

……

经过做java同学的不懈努力,终于找到解决方法:

java绿色背景代码更改成:

call.setOperationName(new QName("http://192.168.168.180/ss/Service.asmx", "GetTestQuestions"));
终于得到期待的结果了。

总结一下原因:

.net的webservice指定了namespace:http://192.168.168.180/ss/Service.asmx,但是java调用时没有指定,所以总提示找不到“”,如果我们仔细查看.net webservice的soap请求格式时会发现,要求的格式是(注意蓝色背景的文字)

SOAP

下面是一个 SOAP 请求和响应示例。所显示的占位符需要由实际值替换。

POST /ss/service.asmx HTTP/1.1Host: 192.168.168.180Content-Type: text/xml; charset=utf-8Content-Length: lengthSOAPAction: "http://192.168.168.180/ss/Service.asmx/GetTestQuestions"    stringstring