Pergunta

Eu estou tentando usar um serviço web de terceiros (por isso não têm acesso ao código do serviço web). Em Visual Studio 2008 eu criei um projeto novo site (ASP e C #), e adicionado a referência da web (não serviço de internet! Então eu acho que não é um serviço WCF ... correto?).

O problema é que a partir da documentação do serviço web eu sei que cada pedido de sabão tem de ser enviado com a seguinte envelope e cabeçalho, você pode por favor me dizer como adicionar isso em meus pedidos de sabão? Todas as soluções que eu encontrei necessários modificando a fonte serviço web ou proxy, eu não posso fazer isso porque eu não tenho acesso à fonte de serviço Web e o proxy do serviço web no cliente no Visual Studio 2008 vem em um read-only arquivo temporário!

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<soap:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" soap:mustUnderstand="1">
<wsse:UsernameToken xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:Username>gimme.data@stats.com</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">Ima5tatto</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soap:Header>
<soap:Body xmlns:ns2="http://neighbourhood.statistics.gov.uk/nde/v1-0/discoverystructs">
<ns2:AreaAtLevelElement>
<AreaIdWithLevelType>
<AreaId>276704</AreaId>
<LevelTypeId>12</LevelTypeId>
</AreaIdWithLevelType>
</ns2:AreaAtLevelElement>
</soap:Body>
</soap:Envelope>
Foi útil?

Solução

Você pode estaticamente adicionar cabeçalhos das mensagens no arquivo de configuração usando o cabeçalhos elemento no extremidade elemento . Cada elemento filho do elemento cabeçalhos será copiado como está no cabeçalho de sua mensagem.

Outras dicas

Eu estou lutando com esse mesmo problema e, até agora, ter escrito uma mensagem inspetor para ser capaz de chegar aos cabeçalhos SOAP, embora eu não tenho certeza como obter o wsse: material de segurança lá sem ter que fazê-lo manualmente. Eu gostaria de ser capaz de usar o esquema WS-Security (bem como esquemas SAML) para construir o wsse: material de segurança ...

Por que vale a pena o meu código inspector de mensagem está abaixo, se eu resolver isso eu vou postá-lo sobre este tópico.

Aqui é onde eu adicionar o comportamento do cliente:

client.Endpoint.Behaviors.Add(new CustomBehavior());
msgOutput = client.ProvideAndRegisterDocumentSetXDR(msgInput);

E aqui é o comportamento inspetor de mensagem e personalizado:

public class CustomMessageInspector : System.ServiceModel.Dispatcher.IClientMessageInspector
{
    public void AfterReceiveReply(ref WCF.Message reply, object correclationState)
    {
    }

    public Object BeforeSendRequest(ref WCF.Message request, IClientChannel channel)
    {
        MessageHeaders headers = new MessageHeaders(MessageVersion.Soap11WSAddressing10);
        MessageHeader header = MessageHeader.CreateHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "");
        request.Headers.Add(header);
        return null;
    }
}


public class CustomBehavior : System.ServiceModel.Description.IEndpointBehavior
    {
        public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
        }

        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRunTime)
        {
            CustomMessageInspector inspector = new CustomMessageInspector();
            clientRunTime.MessageInspectors.Add(inspector);
        }

        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {
        }

        public void Validate(ServiceEndpoint endpoint)
        {
        }
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top