c#调用带有安全认证的java webservice
最近使用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的更多相关文章
- java servlet调用带有多个返回结果集的存储过程
一.mysql存储过程 这里我先说下我这个功能实现的逻辑及途中遇到的一些问题.这个存储过程一共带两个输入参数,一共关联到两张表的查询,每个参数都对应查询表中的一个判断,所以一共返回了两个结果集(当然要 ...
- java Servlet+mysql 调用带有输入参数和返回值的存储过程(原创)
这个数据访问的功能,我在.NET+Mysql .NET+Sqlserver PHP+Mysql上都实现过,并且都发布在了我博客园里面,因为我觉得这个功能实在是太重要,会让你少写很多SQL语句不说,还 ...
- JAVA 调用Axis2 code generator 生成的webservice
以下代码为调用 JAVA 调用Axis2 code generator 生成的webservice的代码. package test; import java.rmi.RemoteException; ...
- Java WebService接口生成和调用 图文详解>【转】【待调整】
webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...
- Java WebService 开发简单实例
Web Service 是一种新的web应用程序分支,他们是自包含.自描述.模块化的应用,可以发布.定位.通过web调用.Web Service可以执行从简单的请求到复杂商务处理的任何功能.一旦部署以 ...
- paip.myeclipse7 java webservice 最佳实践o228
paip.myeclipse7 java webservice 最佳实践o228 java的ws实现方案:jax-ws>>xfire ws的测试工具 webservice测试调用工具W ...
- MAXIMO系统 java webservice 中PDA移动应用系统开发
MAXIMO系统 java webservice 中PDA移动应用系统开发 平时经常用的wince PDA手持设备调用c#写的webservice, 当然PDA也可以调用java webservic ...
- java webservice的多种实现方法汇总
一.基于EJB容器管理webservice : 1.首先建立一个Web services EndPoint: package cn.test.service.impl; import java ...
- [Java] webservice soap,wsdl 例子
java 调用webservice的各种方法总结 现在webservice加xml技术已经逐渐成熟,但要真正要用起来还需时日!! 由于毕业设计缘故,我看了很多关于webservice方面的知识,今天和 ...
随机推荐
- OpenJudge/Poj 1844 Sum
1.链接地址: http://bailian.openjudge.cn/practice/1844 http://poj.org/problem?id=1844 2.题目: Sum Time Limi ...
- 简单的powershell 批量生成身份证复印件
用Powshell 脚本批量完成,代码比较简单,出生日期,图片我都没有改,图片用于测试,附件. cls; $path = Split-Path -Parent $MyInvocation.MyComm ...
- WPF中三种方法得到当前屏幕的宽和高
WPF程序中的单位是与设备无关的单位,每个单位是1/96英寸,如果电脑的DPI设置为96(每个英寸96个像素),那么此时每个WPF单位对应一个像素,不过如果电脑的DPI设备为120(每个英寸120个像 ...
- C Primer Plus(第五版)学习笔记-可变宏:...和__VA_ARGS__
一 .__VA_ARGS__ P454 所讲printf()这些输出函数的参数是可变的,在调试程序时,可能希望定义参数为可变的输出函数, 那么可变参数宏会是一个选择,例如: #define DEBUG ...
- 在Linux系详解Linux bash中的变量
(大讲台:国内首个it在线教育混合式自适应学习) 统中进行日常运维或者是编写脚本时,变量是再熟悉不过的了,但这些变量都有哪些类型,具体的用法又有哪些差异呢?本文整理分享给大家: 一.bash变量类型: ...
- Centos 6.2上安装使用 Informix11.70 数据库
环境要求:操作系统: Centos 6.2 32位数据库软件: iif.11.70.UC7IE.Linux-RHEL5.tar(在IBM网站上注册个帐号就可以下载,包括windows,Linux,Un ...
- Python和VS
下载VS Code 安装插件Python 安装Python,注意这里需要把Python的目录配置到环境变量中 文档结构非常重要,py文件一定位于根目录,.vscode平级:我曾经因为py文件在.vsc ...
- 【已解决】Vmware无法创建虚拟网卡的问题
最近因为各种需要,要在虚拟机里使用桥接方式连接.但是不管怎么操作,都无法添加虚拟网卡.连续好多天需要用到桥接上网,今儿多方搜索,找到了解决方案. 参考资料:http://tieba.baidu.com ...
- Linux下相关查找文件命令(find locate which whereis type)
以下内容摘自:http://blog.csdn.net/jessica1201/article/details/8139249 标注的内容为自己的补充: 我们经常需要在系统中查找一个文件,那么在lin ...
- Jmeter 日志设置---如何设置java协议中被测jar的日志?
先转载一下Jmeter的日志设置: Jmeter运行出现问题可以通过调整jmeter的日志级别定位问题,但运行测试时建议关闭jmeter日志,jmeter打印日志耗费系统性能. Jmeter日志默认存 ...