Java 之 调用.Net的 WebService 整理

  最近做一个 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: 无法识别请求元素 &lt;GetTestQuestions xmlns=''&gt;。

解决方法:

  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>
原文地址:https://www.cnblogs.com/xinaixia/p/4788745.html