Domanda

Sto provando a utilizzare un servizio Web di terze parti (quindi non ho accesso al codice del servizio Web). In Visual Studio 2008 ho creato un nuovo progetto di sito Web (ASP e c #) e ho aggiunto il riferimento Web (non un servizio Web! Quindi immagino che non sia un servizio WCF ... corretto?).

Il problema è che dalla documentazione del servizio web so che ogni richiesta di sapone deve essere inviata con la seguente busta e intestazione, puoi dirmi come aggiungerla nelle mie richieste di sapone? Tutte le soluzioni che ho trovato necessarie modificando l'origine del servizio Web o il proxy, non posso farlo perché non ho accesso all'origine del servizio Web e il proxy del servizio Web nel client in Visual Studio 2008 è disponibile in sola lettura file temporaneo!

<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>
È stato utile?

Soluzione

Puoi aggiungere staticamente intestazioni ai messaggi nel file di configurazione usando le intestazioni nell'elemento endpoint . Ogni elemento figlio dell'elemento headers verrà copiato come nell'intestazione del tuo messaggio.

Altri suggerimenti

Sono alle prese con questo stesso problema e finora ho scritto un inspector per essere in grado di accedere alle intestazioni SOAP, anche se non sono sicuro di come ottenere wsse: roba di sicurezza lì dentro senza doverlo fare manualmente. Mi piacerebbe poter usare lo schema WS-Security (così come gli schemi SAML) per costruire il wsse: roba di sicurezza ...

Per quello che vale il codice del mio ispettore dei messaggi è sotto, se lo risolvo lo posterò su questa discussione.

Ecco dove aggiungo il comportamento al client:

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

Ed ecco la finestra di ispezione dei messaggi e il comportamento personalizzato:

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)
        {
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top