2009-06-18 4 views
3

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 de service Web, donc je suppose que ce n'est pas un service WCF ... correct?). Le problème est que de 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 dans mes demandes de savon? Toutes les solutions trouvées nécessitaient de modifier la source ou le proxy du service Web, je ne peux pas le faire car je n'ai pas accès à la source du service Web et le proxy du service Web du client dans Visual Studio 2008 est en lecture. seulement le fichier temporaire!Ajouter une demande d'en-tête de savon à un savon dans Visual Studio 2008

<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>[email protected]</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> 

Répondre

3

Vous pouvez ajouter statiquement les en-têtes des messages dans le fichier de configuration en utilisant l'élément headers dans l'élément endpoint. Chaque élément enfant de l'élément headers sera copié tel quel dans l'en-tête de votre message.

0

Je suis aux prises avec ce même problème et jusqu'à maintenant j'ai écrit un message inspector pour pouvoir accéder aux en-têtes SOAP, même si je ne suis pas sûr de savoir comment obtenir le wsse: des trucs de sécurité là-dedans sans avoir à le faire manuellement. Je voudrais pouvoir employer le schéma de WS-Sécurité (aussi bien que les schémas de SAML) pour construire le wsse: substance de sécurité ...

Pour ce que cela vaut mon code d'inspecteur de message est ci-dessous, si je résous ceci I Je vais poster sur ce fil.

est ici où j'ajoute le comportement au client:

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

Et voici l'inspecteur des messages et 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) 
     { 
     } 
    } 
+1

lire le [FAQ] (http://stackoverflow.com /FAQ). Ce n'est pas un forum de discussion. Posez votre propre question - nous ne répondons pas à la discussion ici. Aussi, -1 pour ne pas remarquer qu'il utilise une "référence web". –

Questions connexes