none
Como escribir el header de una webservice desde c#; la webservice esta en php RRS feed

  • Pregunta

  • Un cordial saludo

    Tengo una ws desarrollada en php, el cual tiene un método para autenticarse

    Tengo una aplicación en windowsform en C# que debe consumir esa webservice

    Como puedo escribir el header de la webservice desde c#?

    en php seria de esta manera

    $header = new SoapHeader($ns, 'AuthHeader',$authHeader);

    $client->addSoapInputHeader($header);

    como sería en c#?

    En la aplicación en c# yo agregue la webservice desde

    References->add service reference-> ....

    Agredeceré sus comentarios

    lunes, 3 de diciembre de 2018 20:50

Respuestas

  • Para escribir cabeceras personalizadas puedes basarte en este codigo

    private static void Main()
    {
        using (var client = new ServiceClient())
        using (var scope = new OperationContextScope(client.InnerChannel))
        {
            MessageHeader usernameTokenHeader = MessageHeader.CreateHeader("UsernameToken",
                "http://test.com/webservices", "username");
            OperationContext.Current.OutgoingMessageHeaders.Add(usernameTokenHeader);
    
            MessageHeader passwordTextHeader = MessageHeader.CreateHeader("PasswordText",
                "http://test.com/webservices", "password");
            OperationContext.Current.OutgoingMessageHeaders.Add(passwordTextHeader);
    
            MessageHeader sessionTypeHeader = MessageHeader.CreateHeader("SessionType",
                "http://test.com/webservices", "None");
            OperationContext.Current.OutgoingMessageHeaders.Add(sessionTypeHeader);
    
            string result = client.GetData(1);
            Console.WriteLine(result);
        }
        Console.ReadKey();
    }
    

    Con esto obtendrías una cabecera soap como esta

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
        <s:Header>
            <UsernameToken xmlns="http://test.com/webservices">username</UsernameToken>
            <PasswordText xmlns="http://test.com/webservices">password</PasswordText>
            <SessionType xmlns="http://test.com/webservices">None</SessionType>
            <To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:13332/Service1.svc</To>
            <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IService/GetData</Action>
        </s:Header>
    </s:Envelope>


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Propuesto como respuesta CrissR lunes, 3 de diciembre de 2018 21:23
    • Marcado como respuesta Pablo RubioModerator lunes, 10 de diciembre de 2018 17:03
    lunes, 3 de diciembre de 2018 20:57
    Moderador

Todas las respuestas

  • hola

    en el articulo

     Authenticate .NET Web Service with Custom SOAP Header

    crean un servicio en .net definiendo un custom soap header, pero podrias ver como en el cliente instancian este usando el proxy del web reference

    si con php te dejo crear el codigo del web reference podria ver de aplicar lo mismo

    revisa el codigo generado por el web reference a ver si hya clases que hagan referencia al header

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 3 de diciembre de 2018 20:56
  • Para escribir cabeceras personalizadas puedes basarte en este codigo

    private static void Main()
    {
        using (var client = new ServiceClient())
        using (var scope = new OperationContextScope(client.InnerChannel))
        {
            MessageHeader usernameTokenHeader = MessageHeader.CreateHeader("UsernameToken",
                "http://test.com/webservices", "username");
            OperationContext.Current.OutgoingMessageHeaders.Add(usernameTokenHeader);
    
            MessageHeader passwordTextHeader = MessageHeader.CreateHeader("PasswordText",
                "http://test.com/webservices", "password");
            OperationContext.Current.OutgoingMessageHeaders.Add(passwordTextHeader);
    
            MessageHeader sessionTypeHeader = MessageHeader.CreateHeader("SessionType",
                "http://test.com/webservices", "None");
            OperationContext.Current.OutgoingMessageHeaders.Add(sessionTypeHeader);
    
            string result = client.GetData(1);
            Console.WriteLine(result);
        }
        Console.ReadKey();
    }
    

    Con esto obtendrías una cabecera soap como esta

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
        <s:Header>
            <UsernameToken xmlns="http://test.com/webservices">username</UsernameToken>
            <PasswordText xmlns="http://test.com/webservices">password</PasswordText>
            <SessionType xmlns="http://test.com/webservices">None</SessionType>
            <To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:13332/Service1.svc</To>
            <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IService/GetData</Action>
        </s:Header>
    </s:Envelope>


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Propuesto como respuesta CrissR lunes, 3 de diciembre de 2018 21:23
    • Marcado como respuesta Pablo RubioModerator lunes, 10 de diciembre de 2018 17:03
    lunes, 3 de diciembre de 2018 20:57
    Moderador