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;
     }
    }

  • 相关阅读:
    EXTJS 4.2 资料 控件之checkboxgroup的用法(静态数据)
    EXTJS 4.2 资料 控件之Window窗体相关属性的用法
    EXTJS 4.2 资料 控件之textfield文本框加事件的用法
    Entity Framework 学习笔记(一)之数据模型 数据库
    EXTJS 4.2 资料 控件之checkboxgroup的用法(动态数据)
    EXTJS 4.2 资料 控件之Grid 列鼠标悬停提示
    Entity Framework 学习笔记(二)之数据模型 Model 使用过程
    EXTJS 4.2 资料 控件之radiogroup 的用法
    EXTJS API
    vue移动端弹框组件,vue-layer-mobile
  • 原文地址:https://www.cnblogs.com/jamin/p/2169630.html
Copyright © 2011-2022 走看看