• 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>
  • 相关阅读:
    使用RabbitMq
    创建.NET core的守护进程
    nginx配置
    让.net core 支持静态文件
    关于sql中如何动态加WHERE条件
    CentOS上部署.net core
    chrom中 background 调用pop.js
    windows下安装redis
    sql server导出大批量数据
    python爬虫笔记
  • 原文地址:https://www.cnblogs.com/xinaixia/p/4788745.html
Copyright © 2020-2023  润新知