c# web-services wse3.0

c# - Elimine las secciones WS-Addressing/WS-Security de la solicitud del cliente WSE 3.0



web-services wse3.0 (5)

Encontré que la manera más fácil de eliminar estos encabezados de seguridad y direccionamiento era cambiar la configuración del servicio web para usar BasicHttpBinding lugar del WSHttp binding .

Tengo una clase simple de proxy del servicio web C # que creé con WSDL.exe. Invoco un método en el servicio web remoto, y está incluyendo un montón de encabezados WS-Addressing y WS-Security que no quiero (y que el servidor se está ahogando). Aquí hay un ejemplo de la solicitud de jabón en bruto:

<?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>

Pero no me importan las cosas de WS-Addressing / WS-Security . No he hecho nada para incluirlo. Parece que el paquete .NET WSE 3.0 los está agregando de forma predeterminada. ¿Hay alguna manera de deshacerse de estos? No veo propiedades en mi objeto proxy que me permitan eliminar estas secciones. He intentado:

proxyObject.Addressing.Clear(); proxyObject.Security.Clear();

Esos causan una excepción de referencia nula cuando invoco mi método de servicio web.

Quiero que la solicitud SOAP se vea así:

<?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>

Gracias por adelantado


Bueno, terminé usando una técnica que he usado en el pasado. Creé clases que implementan SoapFilter y PolicyAssertion que me permiten modificar el XML sin procesar de la solicitud SOAP antes de que se envíe. A continuación hay un ejemplo:

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; } }

Luego, en el contructor del proxy del servicio web, aplica la política:

/// <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); } }


Me pregunto si su problema podría no haberse resuelto simplemente al no usar WSE.


Basado en la respuesta en esta página, agregué el código a continuación para eliminar el encabezado específico (por nombre de etiqueta) recursivamente 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


para eliminar el encabezado de direccionamiento, utilicé el siguiente código en una de mis aplicaciones.

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); }

Utilicé la función SecureMessage porque quería agregar tokens de seguridad, pero el mismo código se puede usar en la función ProcessMessage .