visual studio crear consumir consume .net web-services soap

.net - studio - soap web service java



Cómo pasar el encabezado de soap cuando WSDL no lo define? (4)

Tengo un servicio web al que llamo y su WSDL publicado en realidad no define gran parte del servicio, 3/4 de los cuales debe compilar manualmente después.

El problema que tengo es que necesitan un SoapHeader con información específica, pero no tengo forma de hacerlo. Las únicas cosas reales que tengo para el servicio es un método proxy que se creó (MyMethod) al que puedo pasar mi mensaje. ¿Cómo puedo configurar / enviar un encabezado de soap con él también?

Todos los servicios que he tenido, he podido usar los elementos vinculados automáticamente de Visual Studio.


Es posible que desee ver esto para algo similar; parece factible, pero mucho trabajo ... o podría compilar toda la solicitud manualmente (incluso peor ...).


¡Pude hacer esto al modificar el código proxy autogenerado manualmente y simplemente inyectar una clase que heredó "SoapHeader" y agregué el atributo al método!

No puedo volver a generar o volver a actualizar el proxy, pero hizo el trabajo, y solo tomó 15 minutos.


Si necesita control de grano fino sobre cómo se procesa el encabezado xml de soap (ocurre al interactuar con un servicio web escrito con java), siempre puede anular todo el procesamiento implementando IXmlSerializable

[XmlRoot("customHeader", Namespace = "http://somecompany.com/webservices/security/2012/topSecret")] public class customHeader: SoapHeader, IXmlSerializable { public customHeader() { Actor = "http://schemas.xmlsoap.org/soap/actor/next"; MustUnderstand = false; } public System.Xml.Schema.XmlSchema GetSchema() { return null; //throw new NotImplementedException(); } public void ReadXml(XmlReader reader) { //throw new NotImplementedException(); } public void WriteXml(XmlWriter writer) { writer.WriteAttributeString("soap:actor", Actor); writer.WriteAttributeString("soap:mustUnderstand", MustUnderstand ? "1" : "0"); writer.WriteRaw("some encrypted data"); //get it exactly the way you want it in here without mucking with Xml* property attributes for hours on end //writer.WriteElement(...); } }


Es una publicación antigua pero puede ser útil para otros.

Al integrar WSDL en Visual Studio, obtiene una nueva clase derivada de SoapHttpClientProtocol dentro de un nuevo espacio de nombres.

Afortunadamente, esta clase es parcial, esto significa que puede extenderla en su código para que las modificaciones que realice no se sobrescriban cuando actualice desde el WSDL.

Mi clase generada WSDL es:

namespace TheServiceNameSpace { public partial class TheClassName : System.Web.Services.Protocols.SoapHttpClientProtocol { //Class Code } }

Para agregar el encabezado personalizado, agrego a mi proyecto un nuevo archivo cs con el siguiente contenido:

namespace TheServiceNameSpace { public partial class SecurityHeader : SoapHeader { public String username { get; set; } public String password { get; set; } public String apikey { get; set; } } public partial class TheClassName { public SecurityHeader SEC = new SecurityHeader() { username = "xxxx", password = "xxxx", apikey = "xxxx" }; protected override XmlWriter GetWriterForMessage(SoapClientMessage message, int bufferSize) { message.Headers.Add(SEC); return base.GetWriterForMessage(message, bufferSize); } } }

Lo que hace, es:

  • 1 - Cree un encabezado SOAP personalizado que contenga las variables esperadas
  • 2 - Extender la clase generada para agregar una referencia al nuevo encabezado
  • 3 - Anule el método GetWriterForMessage para que pueda agregar mi encabezado en la solicitud que se enviará al servicio.