Question

J'essaie d'utiliser un service Web tiers (je n'ai donc pas accès au code du service Web). Dans Visual Studio 2008, j'ai créé un nouveau projet de site Web (ASP et c #) et ajouté la référence Web (pas le service Web! Je suppose donc qu'il ne s'agit pas d'un service WCF ... correct?).

Le problème est que, d'après la documentation du service Web, je sais que chaque demande de savon doit être envoyée avec l'enveloppe et l'en-tête suivants. Pouvez-vous me dire comment l'ajouter à mes demandes de savon? Toutes les solutions que j'ai trouvées nécessitaient de modifier la source de service Web ou le proxy. Je ne peux pas le faire car je n'ai pas accès à la source de service Web et le proxy de service Web du client dans Visual studio 2008 est en lecture seule. fichier temporaire!

<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>
Était-ce utile?

La solution

Vous pouvez ajouter des en-têtes aux messages du fichier de configuration de manière statique à l'aide des en-têtes. Elément dans l'élément point de terminaison . Chaque élément enfant de l’en-tête sera copié tel quel dans l’en-tête de votre message.

Autres conseils

Je suis aux prises avec le même problème et à ce jour, j'ai écrit un message. inspecteur pour pouvoir accéder aux en-têtes SOAP, bien que je ne sois pas sûr d’obtenir le contenu wsse: security sans avoir à le faire manuellement. J'aimerais pouvoir utiliser le schéma WS-Security (ainsi que les schémas SAML) pour construire le logiciel wsse: security stuff ...

Pour ce qui vaut la peine que mon code inspecteur de message soit ci-dessous, si je résous ce problème, je le posterai sur ce fil.

Voici où j'ajoute le comportement au client:

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

Et voici l'inspecteur de message et le comportement personnalisé:

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)
        {
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top