最近使用c#调用另外一个同事写的java webservice耽误了很多时间,网上资料不太完整,走了很多弯路,希望对大家有帮助。

基本思路是
1.拼装soap使用http post ,主要将验证身份信息放入header中,以下code供参考:8-15行内用户、密码,其他soap信息需要根据自己的service修改,

可以使用soapui获取到body以及xmlns信息


 1 public class InvokeServiceWithSoap
 2     {
 3         public static void InvokeService()
 4         {
 5             StringBuilder soap = new StringBuilder();
 6             soap.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
 7             soap.Append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:end=\"http://localhost/service/\">");
 8             soap.Append("<soapenv:Header>");
 9             soap.Append("<wsse:Security xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\">");
10             soap.Append("<wsse:UsernameToken>");
11             soap.Append("<wsse:Username>username</wsse:Username>");//用户名
12             soap.Append("<wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\">password</wsse:Password>");//口令
13             soap.Append("</wsse:UsernameToken>");
14             soap.Append("</wsse:Security>");
15             soap.Append("</soapenv:Header>");
16             soap.Append("<soapenv:Body>");
17             soap.Append("<end:service1>");
18             soap.Append("<arg0></arg0>");
19             soap.Append("</end:service1>");
20             soap.Append(" </soapenv:Body>");
21             soap.Append(" </soapenv:Envelope>");
22 
23             string url = "http://localhost/end:service1";
24             var result = GetSOAPReSource(url, soap.ToString());
25 
26         }
27 
28         public static string GetSOAPReSource(string url, string datastr)
29         {
30             try
31             {
32                 //request
33                 Uri uri = new Uri(url);
34                 WebRequest webRequest = WebRequest.Create(uri);
35                 webRequest.ContentType = "text/xml; charset=utf-8";
36                 webRequest.Method = "POST";
37                 using (Stream requestStream = webRequest.GetRequestStream())
38                 {
39                     byte[] paramBytes = Encoding.UTF8.GetBytes(datastr.ToString());
40                     requestStream.Write(paramBytes, 0, paramBytes.Length);
41                 }
42                 //response
43                 WebResponse webResponse = webRequest.GetResponse();
44                 using (StreamReader myStreamReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
45                 {
46                     string result = "";
47                     return result = myStreamReader.ReadToEnd();
48                 }
49 
50             }
51             catch (Exception ex)
52             {
53                 throw ex;
54             }
55 
56         }
57 
58     }

2.使用wsdl生成代理类,代理类重写HttpRequest ,将安全验证信息增加到request中,也没有测试通过


 1  protected override System.Net.WebRequest GetWebRequest(Uri uri)
 2         {
 3             System.Net.WebRequest request= base.GetWebRequest(uri);
 4             System.Net.NetworkCredential nc = new System.Net.NetworkCredential();
 5             nc.UserName = "ssotest";//java webservice 用户名  
 6             nc.Password = "ssotest";//java webservice 密码  
 7             request.Credentials = nc;
 8             
 9             return request;
10         }
下面说一个比较简单的方法:
直接使用.net中的服务引用,注意是服务引用(类似WCF引用)主要通过servicemodel来设置安全认证信息,framework3.0以上都支持,
引用后将 Config中 servicemodel 的 endpoint  节点 增加headers ,安全验证信息增加尽量来即可。
以下是完整的config:

 1 <system.serviceModel>
 2     <bindings>
 3       <basicHttpBinding>
 4         <binding name="Service1SoapBinding" maxReceivedMessageSize="99999999"/>
 5       </basicHttpBinding>
 6     </bindings>
 7     <client>
 8         <endpoint address="http://local:9090/ Service1"
 9           binding="basicHttpBinding" bindingConfiguration="onlineUserServiceSoapBinding"
10           contract="smpwcf.Service1" name="Service1ImplPort" >
11             <headers>
12                 <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
13                     <wsse:UsernameToken>
14                         <wsse:Username>username</wsse:Username>
15                         <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</wsse:Password>
16                     </wsse:UsernameToken>
17                 </wsse:Security>
18             </headers>
19         </endpoint>
20     </client> 21   </system.serviceModel>

另外附加一段php soap调用java wsse webservice代码 (已经测试通过)

<?php


//Soap Request
class WSSESoapClient extends SoapClient {                                                                                           
    protected $wsseUser;
    protected $wssePassword;     public function setWSSECredentials($user, $password) {
        $this->wsseUser = $user;
        $this->wssePassword = $password;
    }     public function __doRequest($request, $location, $action, $version)
           {
        try
        {
        if (!$this->wsseUser or !$this->wssePassword)
          {
                   return parent::__doRequest($request, $location, $action, $version);
              }         // get SOAP message into DOM
        $dom = new DOMDocument();
        $dom->loadXML($request);
        $xp = new DOMXPath($dom);
        $xp->registerNamespace('soapenv', 'http://schemas.xmlsoap.org/soap/envelope/');
    
        // search for SOAP header, create one if not found
        $header = $xp->query('/soapenv:Envelope/soapenv:Header')->item(0);
    if (!$header)
           {
            $header = $dom->createElementNS('http://schemas.xmlsoap.org/soap/envelope/', 'soapenv:Header');
            $envelope = $xp->query('/soapenv:Envelope')->item(0);
            $envelope->insertBefore($header, $xp->query('/soapenv:Envelope/soapenv:Body')->item(0));
        }     // add WSSE header 
    $security = $dom->createElementNS('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'wsse:Security');
        $usernameToken = $dom->createElementNS('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'wsse:UsernameToken');
        $username = $dom->createElementNS('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'wsse:Username', $this->wsseUser);
    $password = $dom->createElementNS('http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd', 'wsse:Password', $this->wssePassword);
    $password->setAttribute( "Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText" );
    $security->appendChild($usernameToken);
    $usernameToken->appendChild($username);
        $usernameToken->appendChild($password);
        $header->appendChild($security);         // perform SOAP call
    $request = $dom->saveXML();
//    echo $request;
        return parent::__doRequest($request, $location, $action, $version);
    }
      catch (Exception $e)
      {
           echo "<h2>Post Method Error!</h2>"; 
            echo $e->getMessage(); 
      }
    } } 
  //build soap
try{
    $clientsoap = new WSSESoapClient("http://localhost/service1?wsdl");
    $clientsoap->setWSSECredentials("username","password");
//    $clientsoap->soap_defencoding = 'utf-8';
//    $clientsoap->decode_utf8 = false;
    //soap xml
    $request="<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:end=\"http://localhost/service1/\">"."<soapenv:Body>"."<end:service1>"."<arg0>参数</arg0>"."</end:service1>"."</soapenv:Body>"."</soapenv:Envelope>";
    $location="http://172.16.2.31:9090/smp/ws/onlineuserservice";
    $action=null;
           $version=0;
    $result =$clientsoap->__doRequest($request,$location,$action,$version);
    echo $result;
}
catch (Exception $e) { 
            echo "<h2>Exception Error!</h2>"; 
            echo $e->getMessage(); 
        } 
?>

c#调用带有安全认证的java webservice的更多相关文章

  1. java servlet调用带有多个返回结果集的存储过程

    一.mysql存储过程 这里我先说下我这个功能实现的逻辑及途中遇到的一些问题.这个存储过程一共带两个输入参数,一共关联到两张表的查询,每个参数都对应查询表中的一个判断,所以一共返回了两个结果集(当然要 ...

  2. java Servlet+mysql 调用带有输入参数和返回值的存储过程(原创)

    这个数据访问的功能,我在.NET+Mysql .NET+Sqlserver  PHP+Mysql上都实现过,并且都发布在了我博客园里面,因为我觉得这个功能实在是太重要,会让你少写很多SQL语句不说,还 ...

  3. JAVA 调用Axis2 code generator 生成的webservice

    以下代码为调用 JAVA 调用Axis2 code generator 生成的webservice的代码. package test; import java.rmi.RemoteException; ...

  4. Java WebService接口生成和调用 图文详解>【转】【待调整】

    webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...

  5. Java WebService 开发简单实例

    Web Service 是一种新的web应用程序分支,他们是自包含.自描述.模块化的应用,可以发布.定位.通过web调用.Web Service可以执行从简单的请求到复杂商务处理的任何功能.一旦部署以 ...

  6. paip.myeclipse7 java webservice 最佳实践o228

    paip.myeclipse7  java webservice 最佳实践o228 java的ws实现方案:jax-ws>>xfire ws的测试工具  webservice测试调用工具W ...

  7. MAXIMO系统 java webservice 中PDA移动应用系统开发

    MAXIMO系统 java webservice 中PDA移动应用系统开发  平时经常用的wince PDA手持设备调用c#写的webservice, 当然PDA也可以调用java webservic ...

  8. java webservice的多种实现方法汇总

    一.基于EJB容器管理webservice :     1.首先建立一个Web services EndPoint: package cn.test.service.impl; import java ...

  9. [Java] webservice soap,wsdl 例子

    java 调用webservice的各种方法总结 现在webservice加xml技术已经逐渐成熟,但要真正要用起来还需时日!! 由于毕业设计缘故,我看了很多关于webservice方面的知识,今天和 ...

随机推荐

  1. Headfirst设计模式的C++实现——迭代器(Iterator)

    iterator.h #ifndef _ITERATOR_H_ #define _ITERATOR_H_ #include "menu_item.h" class Iterator ...

  2. 配置Apache+Mysql+Php

    以下操作均在Debian 6.0 64bit 环境root权限下进行,如果提示权限不足请切换至root用户或者sudo,本人比较喜欢自行安装,因为安装的过程中能最小化安装而且能够知道安装了什么,然后可 ...

  3. win7下 mysql主从配置实现

    win7下学习 mysql主从复制 一.环境: 主服务器(master):192.168.1.23 mysql版本:5.5 从服务器(slave):192.168.1.24 mysql版本:5.5   ...

  4. javascripct流程语句

    1.条件选择       if 语句:只有当指定条件为true时,使用该语句来执行代码 if...else语句:当条件为true时执行代码,当条件为 false 时执行其他代码 if...else i ...

  5. 11个有用的Linux命令

    Linux命令行吸引了大多数Linux爱好者.一个正常的Linux用户一般掌握大约50-60个命令来处理每日的任务.今天为你解释下面几个命令:sudo.python.mtr.Ctrl+x+e.nl.s ...

  6. 高性能IO设计的Reactor和Proactor模式(转)

    在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,我们首先的搞明白 ...

  7. web2py--------------用web2py写 django的例子 --------建立一个投票应用(3)

    我们建立了数据模型,然后这次来进行页面的展示 1.这里是列表页面的 control 这里是dal的语法 只有两行 第一行 是查询出所有问题,也就是问题的id大于0 第二行是返回问题的列表 这里是vie ...

  8. Tomcat安装与配置图文教程

    安装Tomcat之前先配置JDK,JDK的JAVA_HOME变量都必须设置好,以便Tomcat找到JDK.关闭防火墙等. 一:安装版Tomcat 1. 先下载tomcat,到http://tomcat ...

  9. protel DXP的类矢量图功能

    一.概述 在写论文的过程中,我们经常需要将protel DXP上的原理图贴入到WORD中.我们可以选择使用截图工具,然后再导入到WORD中.但是由于普通截图图形文件都是位图文件,当我们将图形文件导入W ...

  10. iOS上绘制自然的签名-b

    这里有一篇很棒的文章写如何在Android上获取流畅的签名:Smoother Signatures:https://corner.squareup.com/2012/07/smoother-signa ...