GVKun编程网logo

JAX-WS-添加SOAP标头

17

在这里,我们将给大家分享关于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标头

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标头:

进行此操作的可移植方法是您创建一个SOAPHandlerSAAJ并与之混淆,但是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 – 如何添加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 >

解决方法

我通过使用WCF解决了它,没有声明任何凭据.我是通过构建我的自定义标题来实现的,我从这个链接获得了帮助

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标头

ajax – 使用JsonRest Store(dojo)自定义http标头

我想知道是否有任何方法可以在Get ajax请求(xhr.get)中设置我自己的自定义http标头,该请求会自动执行JsonRest存储.

有一个相关的主题,但没有一个很好的解决方案:
Dojo Data grid with custom HTTP headers

我已经在’dojo.store.JsonRest’中看到了包含构造函数的JsonRest实现,如果我们能够做到或不做(我不这么认为),这一点并不明显.正在使用的JsonRest存储示例:

var store = new JsonRestStore({target: "/Table/" });

解决方法

我将完成它的子类化dojo.store.JsonRest,你可以在 this jsFiddle中看到.

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引用

c#-4.0 – 将WSSE SOAP标头添加到Web引用

我正在尝试将WSSE SOAP Header添加到我的服务调用中,但大多数示例都集中在WCF上.我没有使用WCF.我添加了一个Web引用(WSDL).

我尝试了各种方法但没有成功,比如 – 覆盖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验证

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验证的相关信息,请在本站查询。

本文标签: