zoukankan      html  css  js  c++  java
  • 用java 调用 .net 自定义的 Soap WEB Service

    使用JDK自带的 JAX-WS调用。

    先用vs2010写一个webService

    1、自定义soap类

    public class SecuritySOAPHeader : System.Web.Services.Protocols.SoapHeader
    {
     public SecuritySOAPHeader()
     {
     }

        public string UserName { get; set; }
        public string UserPass { get; set; }

    }

    2.写webService

    public SecuritySOAPHeader currentUser;

    /// <summary>
        /// 取OU字串列表
        /// </summary>
        /// <param name="domainADsPath">LDAP</param>
        /// <returns></returns>
        [WebMethod(EnableSession = true), SoapHeader("currentUser")]
        public string SayHello(string name)
        {
            if (currentUser == null) return "需要验证";

            if (!ValidateUser(currentUser.UserName, currentUser.UserPass))
            {
                return "验证错误";
            }

            try
            {
                return name+"调用成功!";
            }
            catch(Exception ex)
            {
                return ex.Message;
            }
        }

    #region 检测用户
        /// <summary>
        /// 检测用户
        /// </summary>
        /// <param name="user"></param>
        /// <param name="pass"></param>
        /// <returns></returns>
        private bool ValidateUser(string user, string pass)
        {
            string u = SoftoonHelpers.ConfigHelper.GetAppSection("wsUser");
            string p = SoftoonHelpers.ConfigHelper.GetAppSection("wsPwd");

            if (String.IsNullOrEmpty(u) || String.IsNullOrEmpty(p)) return false;
            //u = SoftoonHelpers.SecurityHelper.md5(u);
            p = SoftoonHelpers.SecurityHelper.md5(p);

            if (u.Equals(user) && p.Equals(pass))
            {
                return true;
            }
            return false;
        }
        #endregion

    一个Service就成功了。

    先说下用 .Net调,非常简单

    1.先引用WEB e服务

    2。调用

    SecuritySOAPHeader head = new SecuritySOAPHeader();

                head.UserName = "jamin";
                head.UserPass = Md5("7csky.cn").ToUpper();
                SyncAD ws = new SyncAD();
                ws.SecuritySOAPHeaderValue = head;

     ws.SayHello("张三");

    OK,马上Java调用

    public static void main(String[] args) throws MalformedURLException {

    URL url=new URL("http://172.24.29.235:90/ws/SyncAD.asmx?wsdl");
      QName qName=new QName("http://WebAD.com/", "SyncAD");

      SyncAD ad=new SyncAD(url, qName);
      
      HeaderHandlerResolver handlerResolver=new HeaderHandlerResolver();
      ad.setHandlerResolver(handlerResolver);


      SyncADSoap p= ad.getSyncADSoap();

    String hello=p.SayHello("张三");

    }

    要写二个自定义的

    麻烦就在这里了.

    public class HeaderHandlerResolver implements HandlerResolver {

     @SuppressWarnings("rawtypes")
     @Override
     public List<Handler> getHandlerChain(PortInfo portInfo) {
      List<Handler> handlerChain = new ArrayList<Handler>(); 
            HeaderHandler hh = new HeaderHandler(); 
         handlerChain.add(hh);
         return handlerChain;
     }
    }

    public class HeaderHandler implements SOAPHandler<SOAPMessageContext> {

     @Override
     public boolean handleMessage(SOAPMessageContext context) {
      Boolean request_p = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

      if (request_p) {
       try {
        
        SOAPMessage msg = context.getMessage();
        //从SOAP信息中取出认证信息
        SOAPEnvelope env = msg.getSOAPPart().getEnvelope();
        SOAPHeader hdr = env.getHeader();
      
        if (hdr == null)
         hdr = env.addHeader();

        // 添加认证信息 自定义soap头名
        QName qname_user = new QName("http://WebAD.com/", "SecuritySOAPHeader");
        SOAPHeaderElement sso = hdr.addHeaderElement(qname_user);
        sso.setActor(SOAPConstants.URI_SOAP_1_2_ROLE_NEXT);
        //名称   有前缀则加
        SOAPElement username = sso.addChildElement("UserName");
        //值
        username.addTextNode("jamin");
        SOAPElement psw = sso.addChildElement("UserPass");
        psw.addTextNode("7csky.cn");
        
        msg.saveChanges();
        // 把SOAP消息输出到System.out,即控制台 调试信息
        //msg.writeTo(System.out);
        return true;
       } catch (Exception e) {
        e.printStackTrace();
       }
      }
      return false;
     }

     @Override
     public boolean handleFault(SOAPMessageContext context) {
      // TODO Auto-generated method stub
      return false;
     }

     @Override
     public void close(MessageContext context) {
      // TODO Auto-generated method stub
      
     }

     @Override
     public Set<QName> getHeaders() {
      // TODO Auto-generated method stub
      return null;
     }
    }

  • 相关阅读:
    浏览器和node中的event loop的区别
    path.resolve(dir)与path.join(__dirname,dir)的区别
    如何在typescript项目中使用eslint
    eslint无法检测ts类型错误
    todo
    brew update 卡住
    async await原理
    node的require
    Hive表头导出成csv文件
    算法--决策树
  • 原文地址:https://www.cnblogs.com/jamin/p/2169630.html
Copyright © 2011-2022 走看看