最近做一个 java 调用 .net 服务的项目,其中 .net做了一个WebService,需要java来调用。
最开始.net的Service代码如下:
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 "1"; } } }
=================
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("Namespace名", "方法名")); 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绿色背景代码更改成: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 请求和响应示例。所显示的占位符需要由实际值替换。
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>