Retirer les sections WS-Addressing / WS-Security de WSE 3.0 demande client
-
09-09-2019 - |
Question
J'ai une simple classe proxy de service Web C # que j'ai créé avec WSDL.exe. J'invoque une méthode sur le service Web à distance, et il est notamment un groupe de WS-Addressing et WS-en-têtes de sécurité que je ne veux pas (et que le serveur est en train d'étouffer sur). Voici un exemple de la demande de savon brut:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<soap:Header>
<wsa:Action></wsa:Action>
<wsa:MessageID>urn:uuid:22f12267-b162-4703-a451-2d1c5c5a619b</wsa:MessageID>
<wsa:To>http://example.com/wstest</wsa:To>
<wsse:Security>
<wsu:Timestamp wsu:Id="Timestamp-5c9f0ef0-ab45-421d-a633-4c4fad26d945">
<wsu:Created>2009-04-15T16:27:25Z</wsu:Created>
<wsu:Expires>2009-04-15T16:32:25Z</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
</soap:Header>
<soap:Body>
<Func1 xmlns="http://example.com">
<arg_1 xmlns="">blah</arg_1>
<arg_2 xmlns="">blah2</arg_2></arg_2>
</Func1>
</soap:Body>
</soap:Envelope>
Mais Je ne me soucie pas de WS-Addressing / stuff WS-Security . Je l'ai fait rien à l'inclure. Le package .NET WSE 3.0 semble être de les ajouter par défaut. Y at-il moyen de se débarrasser de ces? Je ne vois pas de propriétés sur mon objet proxy qui me permettent de supprimer ces sections. J'ai essayé:
proxyObject.Addressing.Clear();
proxyObject.Security.Clear();
Les provoquent une exception de référence null quand j'invoque ma méthode de service Web.
Je veux que la requête SOAP à ressembler à ceci:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header>
</soap:Header>
<soap:Body>
<Func1 xmlns="http://example.com">
<arg_1 xmlns="">blah</arg_1>
<arg_2 xmlns="">blah2</arg_2></arg_2>
</Func1>
</soap:Body>
</soap:Envelope>
Merci d'avance
La solution
Eh bien, je me suis retrouvé à l'aide d'une technique que je l'ai utilisé dans le passé. J'ai créé des classes qui mettent en œuvre SoapFilter et PolicyAssertion qui me permettent de modifier les données XML brutes de la requête SOAP avant qu'elle ne soit envoyée. est un exemple ci-dessous:
public class MyPolicy : SoapFilter
{
public override SoapFilterResult ProcessMessage(SoapEnvelope envelope)
{
// Remove all WS-Addressing and WS-Security header info
envelope.Header.RemoveAll();
return SoapFilterResult.Continue;
}
}
public class MyAssertion : PolicyAssertion
{
public override SoapFilter CreateClientInputFilter(FilterCreationContext context)
{
return null;
}
public override SoapFilter CreateClientOutputFilter(FilterCreationContext context)
{
return new MyPolicy();
}
public override SoapFilter CreateServiceInputFilter(FilterCreationContext context)
{
return null;
}
public override SoapFilter CreateServiceOutputFilter(FilterCreationContext context)
{
return null;
}
}
Ensuite, dans votre contructor de service Web proxy que vous appliquez la politique:
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.1433")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name="MyBinding", Namespace="http://example.com")]
public partial class MyWebClient : WebServicesClientProtocol {
// ... member variables here
/// <remarks/>
public MyWebClient()
{
this.Url = "http://example.com";
if ((this.IsLocalFileSystemWebService(this.Url) == true)) {
this.UseDefaultCredentials = true;
this.useDefaultCredentialsSetExplicitly = false;
}
else {
this.useDefaultCredentialsSetExplicitly = true;
}
// Apply policy here
Policy policy = new Policy();
policy.Assertions.Add(new MyAssertion());
this.SetPolicy(policy);
}
}
Autres conseils
pour supprimer l'en-tête d'adressage i utilisé le code ci-dessous dans l'une de mon application.
public override void SecureMessage(SoapEnvelope envelope, Security security)
{
//remove addressing Header from envelope
AddressingHeaders objAH = new AddressingHeaders(envelope);
objAH.RemoveXml(envelope);
//Add Wahtever security token you want to add.
security.Tokens.Add(bla-bla-bla);
}
je SecureMessage fonction parce que je voulais ajouter des jetons de sécurité, mais le même code peut être utilisé dans ProcessMessage fonction .
Je me demande si votre problème ne pourrait pas aussi avoir été résolu simplement ne pas utiliser WSp>
Sur la base de la réponse dans cette page, j'ai ajouté le code ci-dessous pour supprimer en-tête spécifique (par tagname) récursive de XML.
Public Overrides Function ProcessMessage(ByVal envelope As SoapEnvelope) As SoapFilterResult
' Remove all WS-Addressing and WS-Security header info
RemoveTag(envelope.DocumentElement, "wsa:Action")
RemoveTag(envelope.DocumentElement, "wsa:MessageID")
RemoveTag(envelope.DocumentElement, "wsa:To")
Return SoapFilterResult.[Continue]
End Function
Private Sub RemoveTag(ByVal XE As System.Xml.XmlElement, ByVal TagName As String)
For Each N As XmlNode In XE
If N.ChildNodes.Count > 0 Then
RemoveTag(N, TagName)
End If
If N.Name = TagName Then
XE.RemoveChild(N)
End If
Next
End Sub
J'ai trouvé la meilleure façon de supprimer ces en-têtes d'adressage et la sécurité était de changer la configuration du service Web pour utiliser BasicHttpBinding
au lieu de WSHttp binding
.