在这里,我们将给大家分享关于JAX-WS-添加SOAP标头的知识,同时也会涉及到如何更有效地.net–如何添加SOAPSecurity标头、ajax–使用JsonRestStore(dojo)自定义h
在这里,我们将给大家分享关于JAX-WS-添加SOAP标头的知识,同时也会涉及到如何更有效地.net – 如何添加SOAP Security标头、ajax – 使用JsonRest Store(dojo)自定义http标头、c#-4.0 – 将WSSE SOAP标头添加到Web引用、C#调用Java的WebService添加SOAPHeader验证的内容。
本文目录一览:- JAX-WS-添加SOAP标头
- .net – 如何添加SOAP Security标头
- ajax – 使用JsonRest Store(dojo)自定义http标头
- c#-4.0 – 将WSSE SOAP标头添加到Web引用
- C#调用Java的WebService添加SOAPHeader验证
JAX-WS-添加SOAP标头
我正在尝试创建一个独立的客户端来使用某些Web服务。我必须将我的用户名和密码添加到SOAP Header。我尝试添加凭据,如下所示:
OTSWebSvcsService service = new OTSWebSvcsService();OTSWebSvcs port = service.getOTSWebSvcs();BindingProvider prov = (BindingProvider)port;prov.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "myusername");prov.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "mypassword");...
当我在服务上调用方法时,出现以下异常:
com.ibm.wsspi.wssecurity.SoapSecurityException: WSEC5048E: One of "SOAP Header" elements required.
我究竟做错了什么?如何将这些属性添加到SOAP Header?
编辑:我正在使用JDK6中包含的JAX-WS 2.1。我现在正在使用JAX-WS 2.2。我现在得到以下异常:
com.ibm.wsspi.wssecurity.SoapSecurityException: WSEC5509E: A security token whose type is [http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken] is required.
如何创建此令牌?
答案1
小编典典不是100%肯定,因为该问题缺少一些详细信息,但是如果您使用的是JAX-WS
RI,请查看发送请求时添加SOAP标头:
进行此操作的可移植方法是您创建一个
SOAPHandler
SAAJ并与之混淆,但是RI提供了一种更好的方法。创建代理或调度对象时,它们将实现
BindingProvider
接口。使用JAX-WS RI时,您可以向下转换到WSBindingProvider
它,以定义仅由JAX-WS RI提供的更多方法。该接口允许您设置任意数量的Header对象,每个对象代表一个SOAP标头。如果需要,您可以自己实现它,但是很可能您会使用在
Headers
类中定义的工厂方法
之一来创建一个。
> import com.sun.xml.ws.developer.WSBindingProvider;> > HelloPort port = helloService.getHelloPort(); // or something like> that...> WSBindingProvider bp = (WSBindingProvider)port;> > bp.setOutboundHeader(> // simple string value as a header, like> <simpleHeader>stringValue</simpleHeader>> Headers.create(new QName("simpleHeader"),"stringValue"),> // create a header from JAXB object> Headers.create(jaxbContext,myJaxbObject)> );
相应地更新您的代码,然后重试。并且,如果您不使用JAX-WS RI,请更新您的问题并提供更多上下文信息。
更新: 似乎您要调用的Web服务已通过WS-Security /
UsernameTokens保护。这与您最初提出的问题有些不同。无论如何,要配置您的客户端发送用户名和密码,我建议查看一下很棒的文章,为基于Metro的Web服务实现WS-Security UsernameToken Profile(跳至步骤4)。使用NetBeans进行此步骤可能会大大简化工作。
.net – 如何添加SOAP Security标头
我在我的项目中使用.NET Framework 4.0.所以,我首先添加了WebService作为服务引用,并在我的app.config上获取绑定.而且我将列出我的尝试
尝试#1
我实例化了这样的服务并添加了凭据:
在App.Config上
<binding name="SubscriptionWSImplServiceSoapBinding" > <security mode="TransportWithMessageCredential"> <transport clientCredentialType="Basic"/> </security> </binding> SubscriptionWSImplServiceClient ClientWs = new SubscriptionWSImplServiceClient(); ClientWs.ClientCredentials.UserName.UserName = "some-username"; ClientWs.ClientCredentials.UserName.Password = "some-password"; var SomeResposne = ClientWs.RunMethod(); //I have exception at this point
我得到一个例外如下:
System.ArgumentException: The provided URI scheme 'http' is invalid; expected 'https'. Parameter name: via at System.ServiceModel.Channels
例外情况说Web服务的url必须是HTTPS,但给定的Web服务URL是HTTP而不是HTTPS.
但我不介意HttpS并且进行了第二次尝试.
尝试#2
如this answer所述,我尝试如下:
BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential); binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName; CustomBinding customBinding = new CustomBinding(binding); SecurityBindingElement element = customBinding.Elements.Find<SecurityBindingElement>(); element.IncludeTimestamp = false; EndpointAddress address = new EndpointAddress("https://www.GivenServiceUrl.com/WebService"); //Note that the url does not end as ..svc or ..asmx! Just the name like this with no dot or extension SubscriptionWSImplServiceClient ClientWs = new SubscriptionWSImplService(customBinding,address); ClientWs.ClientCredentials.UserName.UserName = "some-username"; ClientWs.ClientCredentials.UserName.Password = "some-password"; var SomeResposne = ClientWs.RunMethod(); //I have exception at this point
我得到一个例外如下:
System.ServiceModel.Security.SecurityNegotiationException: Could not
establish trust relationship for the SSL/TLS secure channel with authority ‘07001’
因此,我参加了我的第三次尝试,我将参考文献作为WebReference而不是作为我的项目的ServiceReference.
尝试#3
SubscriptionWSImplService ClientWs2 = new SubscriptionWSImplService(); var SomeResposne = ClientWs.RunMethod(); //I have exception at this point
我不知道如何发送安全头.
我得到一个例外如下:
System.Web.Services.Protocols.soapHeaderException: An error was discovered processing the <wsse: Security> header
但在这里,我无法添加必要的标题.你能帮帮我吗?
尝试1或尝试2或尝试3,考虑到我使用Framework 4.0,应该使用哪一个?我该如何解决这个问题?
根据文档,最终请求SOAP必须如下所示:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sub="http://subscription.services.ws.fourplay.com.tr/"> <soapenv:Header> <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <wsse:Usernametoken wsu:Id="Usernametoken-12" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <wsse:Username>admin</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">123456</wsse:Password> <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">1lcj+WbCMlrPyhcud4QxiQ==</wsse:Nonce> <wsu:Created>2012-06-05T10:23:26.879Z</wsu:Created> </wsse:Usernametoken> </wsse:Security> </soapenv:Header> <soapenv:Body> <sub:RunMethod> <!--Optional:--> <sub:opaque id>555555555</sub:opaque id> <sub:params> <!--Optional:--> <name>GUID</name> <!--Optional:--> <value>2fc4ce1d-645e-41f4-811e-28510a02a17f </value> </sub:params> </sub: RunMethod >
解决方法
public class SoapSecurityHeader : MessageHeader { private readonly string _password,_username,_nonce; private readonly DateTime _createdDate; public SoapSecurityHeader(string id,string username,string password,string nonce) { _password = password; _username = username; _nonce = nonce; _createdDate = DateTime.Now; this.Id = id; } public string Id { get; set; } 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"; } } protected override void OnWriteStartHeader(XmlDictionaryWriter writer,MessageVersion messageVersion) { writer.WriteStartElement("wsse",Name,Namespace); writer.WriteXmlnsAttribute("wsse",Namespace); } protected override void OnWriteHeaderContents(XmlDictionaryWriter writer,"Usernametoken",Namespace); writer.WriteAttributeString("Id","Usernametoken-10"); writer.WriteAttributeString("wsu","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"); 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.WriteStartElement("wsse","Nonce",Namespace); writer.WriteAttributeString("EncodingType","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"); writer.WriteValue(_nonce); writer.WriteEndElement(); writer.WriteStartElement("wsse","Created",Namespace); writer.WriteValue(_createdDate.ToString("YYYY-MM-DDThh:mm:ss")); writer.WriteEndElement(); writer.WriteEndElement(); } }
以及如何使用标题我从link获得它.
ajax – 使用JsonRest Store(dojo)自定义http标头
有一个相关的主题,但没有一个很好的解决方案:
Dojo Data grid with custom HTTP headers
我已经在’dojo.store.JsonRest’中看到了包含构造函数的JsonRest实现,如果我们能够做到或不做(我不这么认为),这一点并不明显.正在使用的JsonRest存储示例:
var store = new JsonRestStore({target: "/Table/" });
解决方法
A.子类dojo.store.JsonRest:
var MyJsonRest = declare(JsonRest,{ get: function(id,options) { return this.inherited( arguments,[id,lang.mixin(this.defaultGetHeaders,options)] ); } });
所以你重写get方法调用超类’get,但第二个参数选项(即.headers)现在也包含this.defaultGetHeaders的属性.
B.在构造函数中定义defaultGetHeaders:
var myJsonRest = MyJsonRest({ target: "/echo/json/",defaultGetHeaders: { userId: "xyz",requestedBy: "abc",requestedFrom: "123" } });
C.调用myJsonRest.get()方法,您也可以覆盖默认标头:
myJsonRest.get("someId",{ requestedFrom: "321"}).then(function(result) { console.log(result); });
D.检查请求标头:
c#-4.0 – 将WSSE SOAP标头添加到Web引用
我尝试了各种方法但没有成功,比如 – 覆盖GetWebRequest方法:
protected override System.Net.WebRequest GetWebRequest(Uri uri) { string user = "username"; string pwd = "password"; System.Net.WebRequest request = base.GetWebRequest(uri); string auth = string.Format("Basic {0}",Convert.ToBase64String(System.Text.Encoding.Default.GetBytes(string.Format("{0}:{1}",user,pwd)))); request.PreAuthenticate = true; request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested; request.Headers.Add(HttpRequestHeader.Authorization,auth); return request; }
WSSE安全标题应该类似于:
<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <Usernametoken> <Username>username</Username> <Password>password</Password> </Usernametoken> </Security>
提前谢谢了!
亲切的问候,
解决方法
http://underthehood.ironworks.com/2010/01/why-doesnt-my-generated-proxy-class-build-wsse-elements-into-the-soap-request-header.html
Why doesn’t my generated proxy class build WSSE elements into the SOAP request header?
How to add security header to a SOAP message?
哪个提供答案!
C#调用Java的WebService添加SOAPHeader验证
C#调用Java的WebService添加SOAPHeader验证(2)
1.问题描述
调用的Java的webservice
string Invoke(string func, string reqXml)
使用C#直接调用一直报错。
webservice提供方有说明如下:
身份验证采用对SOAP身份认证(用户名/密码验证/序列号)的方式部署,设定用户名和密码由系统配置,所有文本内容编码选择UTF-8编码规范
<?xml version=''1.0'' encoding=''utf-8''?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<vc:Authentication xmlns: vc ="http://ant.com">
<vc:Username>[系统配置] </vc:Username>
<vc:Password>[系统配置]</vc:Password>
<vc:SerialNo>[系统配置]</vc:SerialNo >
</vc:Authentication>
</soapenv:Header>
<soapenv:Body>
</soapenv:Body>
</soapenv:Envelope>
相信就是soapenv:Header这里的问题了,C# 没soapenv:Header这些东西的
网上查了好多类似下面的
https://www.cnblogs.com/o2ds/p/4093413.html
C#访问Java的WebService添加SOAPHeader验证的问题
都没有用
后来尝试sopui及xmlspy创建soap,直接发送xml,终于试出来了,然后C#使用http post调用webservice,成功了。
2.问题解决1
C#拼接的需要http post的soap字符串如下
</SOAP-ENV:Header> 照搬给的文档里的字符串
<SOAP-ENV:Body> 为调用函数,string Invoke(string func, string reqXml) 函数名Invoke,两个参数,自行理解吧
注意:里面的\r\n换行标志都要保留,不然都是报错
string soap = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n" +
"<SOAP-ENV:Envelope\r\n" +
"xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"\r\n" +
"xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\"\r\n" +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n" +
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\r\n" +
"<SOAP-ENV:Header>\r\n" +
"<vc:Authentication\r\n" +
"xmlns:vc=\"http://ant.com\">\r\n" +
"<vc:Username>xx</vc:Username>\r\n" +
"<vc:Password>xxx</vc:Password>\r\n" +
"<vc:SerialNo>xxxx</vc:SerialNo>\r\n" +
"</vc:Authentication>\r\n" +
"</SOAP-ENV:Header>\r\n" +
"<SOAP-ENV:Body>\r\n" +
"<m:Invoke\r\n" +
"xmlns:m=\"http://tempuri.org/\">\r\n" +
"<m:func>" + jkid + "</m:func>\r\n" +
"<m:reqXml>" + HttpUtility.HtmlEncode(xml) + "</m:reqXml>\r\n" +
"</m:Invoke>\r\n" +
"</SOAP-ENV:Body>\r\n" +
"</SOAP-ENV:Envelope>";
然后发送,随便找个http post的代码就行了
public static string GetSOAPReSource(string url, string datastr)
{
try
{
//request
Uri uri = new Uri(url);
WebRequest webRequest = WebRequest.Create(uri);
webRequest.ContentType = "text/xml; charset=utf-8";
webRequest.Method = "POST";
using (Stream requestStream = webRequest.GetRequestStream())
{
byte[] paramBytes = Encoding.UTF8.GetBytes(datastr.ToString());
requestStream.Write(paramBytes, 0, paramBytes.Length);
}
//response
WebResponse webResponse = webRequest.GetResponse();
using (StreamReader myStreamReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
{
string result = "";
return result = myStreamReader.ReadToEnd();
}
}
catch (Exception ex)
{
throw ex;
}
}
3.问题解决2
发现还是报错,http 500错误,和之前不一样,但依然不对
研究webservice的wsdl发现了问题
调用时加上
webRequest.Headers.Add("SOAPAction", "http://tempuri.org/IAjsjService/Invoke");
终于成功了
public static string GetSOAPReSource(string url, string datastr)
{
try
{
//request
Uri uri = new Uri(url);
WebRequest webRequest = WebRequest.Create(uri);
webRequest.ContentType = "text/xml; charset=utf-8";
webRequest.Headers.Add("SOAPAction", "http://tempuri.org/IAjsjService/Invoke");
webRequest.Method = "POST";
using (Stream requestStream = webRequest.GetRequestStream())
{
byte[] paramBytes = Encoding.UTF8.GetBytes(datastr.ToString());
requestStream.Write(paramBytes, 0, paramBytes.Length);
}
//response
WebResponse webResponse = webRequest.GetResponse();
using (StreamReader myStreamReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8))
{
string result = "";
return result = myStreamReader.ReadToEnd();
}
}
catch (Exception ex)
{
throw ex;
}
}
其他调用webservice的方式:
C# 调用WebService的3种方式 :直接调用、根据wsdl生成webservice的.cs文件及生成dll调用、动态调用
我们今天的关于JAX-WS-添加SOAP标头的分享已经告一段落,感谢您的关注,如果您想了解更多关于.net – 如何添加SOAP Security标头、ajax – 使用JsonRest Store(dojo)自定义http标头、c#-4.0 – 将WSSE SOAP标头添加到Web引用、C#调用Java的WebService添加SOAPHeader验证的相关信息,请在本站查询。
本文标签: