您的位置:首页 > 编程语言 > Java开发

Java调用.net的WebService

2009-07-14 17:24 423 查看
引:/article/7163712.html

这几天公司需要做一个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")]

/// <summary>
/// Service1 的摘要说明。
/// </summary>
public class Service : System.Web.Services.WebService
{
public Service()
{
//CODEGEN: 该调用是 ASP.NET Web 服务设计器所必需的
InitializeComponent();
}

#region 组件设计器生成的代码

//Web 服务设计器所必需的
private IContainer components = null;

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{

}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
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调用时没有指定,所以总提示找不到“<GetTestQuestions xmlns=''>”,如果我们仔细查看.net webservice的soap请求格式时会发现,要求的格式是(注意蓝色背景的文字)

SOAP

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


POST /ss/service.asmx HTTP/1.1


Host: 192.168.168.180


Content-Type: text/xml; charset=utf-8


Content-Length: length


SOAPAction: "http://192.168.168.180/ss/Service.asmx/GetTestQuestions"




<?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>


<GetTestQuestions xmlns="http://192.168.168.180/ss/Service.asmx">


<TeacherName>string</TeacherName>


<Subject>string</Subject>


</GetTestQuestions>


</soap:Body>


</soap:Envelope>

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: