Mediante la definición de un atributo que implementa IContactBehavior y IWsdlExportExtension y establecer que el atributo en el contrato de servicio, usted puede agregar fácilmente Encabezados Soap para su wsdl (ver http://wcfextras.codeplex.com/ para obtener más información)

Pero ahora necesito configurar un Encabezado Soap contrato en el wsdl en todos los Operationcontracts y esta vez no puedo establecer un atributo.

Siguiente código (llamado desde IWsdlExportExtension.ExportEndPoint) no funciona, pero no funciona cuando se llama desde el SoapHeaderAttributes (que ejecuta un IWsdlExportExtension.ExportContract)

foreach (OperationDescription operationDescription in context.ContractConversionContext.Contract.Operations)
{
   AddSoapHeader(operationDescription, "SomeHeaderObject", typeof(SomeHeaderObject), SoapHeaderDirection.InOut);                    
}

internal static void AddSoapHeader(OperationDescription operationDescription, string name, Type type, SoapHeaderDirection direction)
{
    MessageHeaderDescription header = GetMessageHeader(name, type);
    bool input = ((direction & SoapHeaderDirection.In) == SoapHeaderDirection.In);
    bool output = ((direction & SoapHeaderDirection.Out) == SoapHeaderDirection.Out);

    foreach (MessageDescription msgDescription in operationDescription.Messages)
    {
        if ((msgDescription.Direction == MessageDirection.Input && input) ||
            (msgDescription.Direction == MessageDirection.Output && output))
            msgDescription.Headers.Add(header);
    }
}

internal static MessageHeaderDescription GetMessageHeader(string name, Type type)
{
    string headerNamespace = SoapHeaderHelper.GetNamespace(type);
    MessageHeaderDescription messageHeaderDescription = new MessageHeaderDescription(name, headerNamespace);
    messageHeaderDescription.Type = type;
    return messageHeaderDescription;
}

Alguien tiene una idea de cómo aplicar este código en todas las operaciones (sin atributos) y al hacer esto, la adición del contrato de la cabecera para el wsdl ?

OriginalEl autor Linefeed | 2009-06-12

3 Comentarios

  1. 5

    La IEndpointBehavior tiene la siguiente interfaz:

    ApplyDispatchBehavior(ServiceEndpoint endPoint, EndPointDispatcher endpointDispatcher);

    Puede agregar Encabezados Soap para el wsdl para las operaciones de la iteración sobre el extremo.Contrato.Las operaciones en el ApplyDispatchBehavior.

    Aquí tienes la solución completa que trabajó para mí:

    void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {
        foreach (OperationDescription operationDescription in endpoint.Contract.Operations)
        {
            foreach (MessageDescription msgDescription in operationDescription.Messages)
            {
                AddSoapHeader(operationDescription, "SomeHeaderObject", typeof(SomeHeaderObject), SoapHeaderDirection.InOut);
            }
        }
    }
    
    internal static void AddSoapHeader(OperationDescription operationDescription, string name, Type type, SoapHeaderDirection direction)
    {
        MessageHeaderDescription header = GetMessageHeader(name, type);
        bool input = ((direction & SoapHeaderDirection.In) == SoapHeaderDirection.In);
        bool output = ((direction & SoapHeaderDirection.Out) == SoapHeaderDirection.Out);
    
        foreach (MessageDescription msgDescription in operationDescription.Messages)
        {
                if ((msgDescription.Direction == MessageDirection.Input && input) ||
                        (msgDescription.Direction == MessageDirection.Output && output))
                        msgDescription.Headers.Add(header);
        }
    }
    
    internal static MessageHeaderDescription GetMessageHeader(string name, Type type)
    {
        string headerNamespace = SoapHeaderHelper.GetNamespace(type);
        MessageHeaderDescription messageHeaderDescription = new MessageHeaderDescription(name, headerNamespace);
        messageHeaderDescription.Type = type;
        return messageHeaderDescription;
    }

    La SoapHeaderHelper se puede encontrar en la WcfExtras.

    Usted tiene foreach MessageDescription bucle tanto en ApplyDispatchBehavior() y AddSoapHeader(). Yo creo que el uno en ApplyDispatchBehavior() debe ser eliminado.

    OriginalEl autor Linefeed

  2. 4

    Puede que desee echar un vistazo a la WCFExtras proyecto en CodePlex – que cuenta con el apoyo de personalizado encabezados SOAP y cosas por el estilo. No es 100% seguro de si es capaz de llenar su necesidad, pero echa un vistazo!

    Marc

    ACTUALIZACIÓN: has mirado en la creación de un WCF extensión, por ejemplo, algo así como un mensaje de inspector, en el cliente y en el lado del servidor?

    El lado del cliente IClientMessageInspector define dos métodos BeforeSendRequest y AfterReceiveReply mientras que el lado del servidor IDispatchMessageInspector el contrario métodos, es decir, AfterReceiveRequest y BeforeSendReply.

    Con esto, se puede agregar encabezados de cada mensaje que se va a través de la red (o de forma selectiva sólo a unos pocos).

    He aquí un fragmento de un IClientMessageInspector implementador utilizamos para automágicamente transmitir la información de configuración regional (lengua y la cultura de la información) a través de los clientes en el servidor – que le dará una idea de cómo empezar:

    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        International intlHeader = new International();
        intlHeader.Locale = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName;
    
        MessageHeader header = MessageHeader.CreateHeader(WSI18N.ElementNames.International, WSI18N.NamespaceURI, intlHeader);
        request.Headers.Add(header);
    
        return null;
    }
    En realidad estaba señalando a WCFExtras a mí mismo, pero no pude averiguar cómo agregar un encabezado soap para el wsdl en todas las operaciones sin los atributos de configuración.
    <jeje> estoy totalmente perdido su vínculo con wcf extras…..
    No veo cómo esto se aplica sobre la modificación del Contrato WSDL. ¿Puede aclarar ?
    Yo no. Los inspectores están muy bien, pero lo que hacen no está reflejado en el contrato WSDL, por lo que el cliente tiene que ser consciente de ello…

    OriginalEl autor marc_s

  3. 0

    Forma más fácil es usar WCFExtrasPlus «https://wcfextrasplus.codeplex.com/wikipage?title=SOAP%20Headers&referringTitle=Documentación«, sólo tiene que añadir dll como referencia a su proyecto y editar su servicio de tal forma:

    [DataContract(Name="MyHeader", Namespace="web")]
    public class MyHeader
    {
        [DataMember(Order=1)]
        public string UserName {get; set;}
        [DataMember(Order=2)]
        public string Password { get; set; }
    }
    
    [SoapHeaders]
    [ServiceContract]
    public interface IMyService
    {
        [SoapHeader("MyHeader", typeof(MyHeader), Direction = SoapHeaderDirection.In)]
        [OperationContract]
        [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]
        bool MyMethod(string input);
    }

    Entonces solicitud Soap parece:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="web" xmlns:tem="http://tempuri.org/">
     <soapenv:Header>
      <web:MyHeader>
         <web:UserName>?</web:UserName>
         <web:Password>?</web:Password>
      </web:MyHeader>
     </soapenv:Header>
     <soapenv:Body>
      <tem:MyMethod>
        <tem:input>?</tem:input>
      </tem:MyMethod>
     </soapenv:Body>
    </soapenv:Envelope>

    Si usted necesita Soap y JSON en el mismo servicio aquí es ejemplo: https://stackoverflow.com/a/23910916/3667714

    OriginalEl autor Ramunas

Dejar respuesta

Please enter your comment!
Please enter your name here