• .Net调用Java端带有WS-Security支持的Web Service【亲测通过】


    做了几年的开发,今天终于鼓起勇气开通了博客园。平时都是找各种大牛,看他们的分享博客的解决BUG。从今天起,我也开始分享我学习之路。还望大家多多支持!       


     

    最近收到一个采用Axis2实现的WebService通过.net对接的需求,开始已为挺简单的一个事,常规引用调用后,测试不通过,需要验证密码。之后。。。开始疯狂的寻码之旅。

    方案一:https://www.cnblogs.com/yf2011/p/5465558.html  

     本方案让我试的好苦,WSE 2.0、WSE 3.0 都是vs老版本的(本人用VS 2017 ),我尝试了一下WSE 3.0,没有成功。大家可以试试,VS2017 NuGET包里还有WSE 3.0,应该是可以的。

    本人方案:

                    参考地址1:https://blog.csdn.net/yiwenbiao68/article/details/46909395

                    参考地址2: https://stackoverflow.com/questions/734355/clueless-about-how-to-create-soap-wssesecurity-header

            参考地址3:https://blog.csdn.net/oscar999/article/details/40340819

    首先本人采用的是WCF配置方案。 参考地址1 解决了WSDL地址如何通过WCF工具 生成客户端可调用的.cs文件。

     操作步骤:

    1. 打开VS 2017的开发人员命令提示符工具
    2. 输入svcutil.exe http://localhost:6054/ServiceDemo.svc?wsdl ,直接回车会生成两个文件.cs、.config。
    3. .cs文件直接拷贝到项目中,.config改成你项目的app.config替换。打开app.config文件
      <?xml version="1.0" encoding="utf-8"?>
      <configuration>
          <system.serviceModel>
              <bindings>
                  <basicHttpBinding>
                      <binding name="data1Binding" />
                  </basicHttpBinding>
                  <customBinding>
                      <binding name="data2Binding">
                          <textMessageEncoding messageVersion="Soap12" />
                          <httpTransport />
                      </binding>
                  </customBinding>
              </bindings>
              <client>
                  <endpoint address="http://XXX1.com/"
                      binding="basicHttpBinding" bindingConfiguration="data1Binding"
                      contract="dataServicePortType" name="dataServiceHttpSoap11Endpoint" />
                  <endpoint address="http://XXX2.com/"
                      binding="customBinding" bindingConfiguration="data2Binding"
                      contract="dataServicePortType" name="dataServiceHttpSoap12Endpoint" />
              </client>
          </system.serviceModel>
      </configuration>

      采坑一:有点可能和我一样有两个地址。那对不起只能用一个,删除一个即可。
      采坑二:如果你的WCF做为一个单项目,要将.config文件内容添加到主项目的.config文件中。

    4. 添加一个SecurityHeader类,代码如下:
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace Code
      {
          public class SecurityHeader : System.ServiceModel.Channels.MessageHeader
          {
              public string userName;
              public string password;
      
              public SecurityHeader(string name,string psw) {
                  userName = name;
                  password = psw;
              }
      
              protected override void OnWriteStartHeader(System.Xml.XmlDictionaryWriter writer, System.ServiceModel.Channels.MessageVersion messageVersion)
              {
                  writer.WriteStartElement("wsse", Name, Namespace);
                  writer.WriteXmlnsAttribute("wsse", Namespace);
              }
      
              protected override void OnWriteHeaderContents(System.Xml.XmlDictionaryWriter writer, System.ServiceModel.Channels.MessageVersion messageVersion)
              {
                  writer.WriteStartElement("wsse", "UsernameToken", Namespace);
      
                  writer.WriteStartElement("wsse", "Username", Namespace);
                  writer.WriteValue(userName);
                  writer.WriteEndElement();
      
                  writer.WriteStartElement("wsse", "Password", Namespace);
                  writer.WriteAttributeString("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
                  writer.WriteValue(password);
                  writer.WriteEndElement();
                  writer.WriteEndElement();
      
              }
      
              public override string Name
              {
                  get { return "Security"; }
              }
      
              public override string Namespace
              {
                  get { return "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; }
              }
          }
      }

      此类主要作用是手动创建了SOAP协议请求头,参考地址2 为原创。参考地址3 是我找到的JAVA版代码,应该能很好的解释为什么要这么写。

    5. 调用方法,代码如下:
      public static void Main(string[] args)
          {
      
              var webService = new ServiceReference1.MyWebService();//你的webservice
                  webService.Open();
      
      
              using (OperationContextScope scope = new OperationContextScope((IContextChannel)webService.InnerChannel))
              {
      
                  MessageHeaders messageHeadersElement = OperationContext.Current.OutgoingMessageHeaders;
                  messageHeadersElement.Add(new SecurityHeader("UserName", "Password"))
      
      
                   var res = webService.MyServe("方法参数");//webservice 里的方法
                  Console.WriteLine(res.ToString());
              }
          }

     这样就可以生成测试了,是不是感觉很简单。可我就是为此事做了三天。第一次写,写的不好的地方,大家请谅解!

  • 相关阅读:
    Android中通过intent打开浏览器到指定网页
    iOS真机调试
    Autodesk Infrastructure Modeler(AIM)冉冉升起的新星
    IKVM.NET_07_用户指南_IKVM.NET 字节码编译器(ikvmc.exe)
    我们——程序员应该关注,功能?设计?
    系统集成的困境
    系统服务_时间同步服务器
    ASP.NET_ASP.NET 缓存Cache
    IKVM.NET_第五篇_用户指南_安装
    IKVM.NET_第四篇_用户指南_概述
  • 原文地址:https://www.cnblogs.com/webtojs/p/9591362.html
Copyright © 2020-2023  润新知