Aggiungi l'intestazione del sapone alla richiesta di sapone in Visual Studio 2008
-
06-07-2019 - |
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>
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)
{
}
}