Partager via


Prise en charge des en-têtes HTTP et SOAP personnalisés

Dernière modification : vendredi 16 avril 2010

S’applique à : SharePoint Server 2010

Dans cet article
En-têtes HTTP
En-têtes SOAP
En-têtes SOAP personnalisés

Grâce aux services Web, vous pouvez utiliser des en-têtes HTTP ou des en-têtes SOAP pour fournir des informations spécifiques à l’application sur le message SOAP ; par exemple, vous pouvez fournir des informations d’authentification et de paiement. BDC prend en charge les en-têtes HTTP et les en-têtes SOAP personnalisés pour passer aux appels de service Web les informations relatives au nom d’utilisateur et au mot de passe.

En-têtes HTTP

BDC peut également envoyer le nom d’utilisateur et le mot de passe stockés dans le fournisseur de banque d’informations sécurisée en tant qu’en-têtes HTTP aux appels de service Web. Les valeurs d’en-tête HTTP (nom d’utilisateur et mot de passe) sont codées en base 64. Par conséquent, dans le service Web, vous devez décoder les valeurs. Vous devez également utiliser SSL pour les services Web qui utilisent cette fonctionnalité, car les valeurs de mot de passe et de nom d’utilisateur ne sont pas chiffrées.

Notes

La liaison de service Web doit prendre en charge le transport HTTP. Notez que cela est obligatoire pour l’envoi d’en-têtes HTTP, mais pas pour l’envoi d’en-têtes SOAP.

Pour utiliser des en-têtes HTTP, vous devez apporter les modifications suivantes dans le fichier de définition d'application :

  1. Attribuez à la propriété SecondarySsoApplicationId de l’élément LobSystemInstance l’ID d’application cible de l’application du magasin sécurisé qui contient le nom d’utilisateur et le mot de passe.

  2. Attribuez aux propriétés HttpHeaderUserName et HttpHeaderPassword de la méthode les noms d'en-tête respectifs attendus par le service Web.

Exemple

<LobSystemInstance Name="ContosoInstance" DefaultDisplayName="SimpleHTTPInstance">
  <Properties>
    <Property Name="LobSystemName" Type="System.String">Contoso</Property> 
    <Property Name="AuthenticationMode" Type="System.String">WindowsCredentials</Property> 
     …
     …
    <Property Name="SecondarySsoApplicationId" Type="System.String">Contoso</Property> 
  </Properties>
</LobSystemInstance>
<Method Name="HelloWorld" DefaultDisplayName="HelloWorld">
     <Properties>
        <Property Name="HttpHeaderUserName" Type="System.String">UserName</Property>
         <Property Name="HttpHeaderPassword" Type="System.String">UserPassword</Property>
      </Properties>
      …
</Method>

En-têtes SOAP

BDC peut également envoyer le nom d’utilisateur et le mot de passe stockés dans les paramètres du fournisseur de banque d’informations sécurisée en tant qu’en-têtes SOAP aux appels de service Web. Les valeurs d’en-tête SOAP (nom d’utilisateur et mot de passe) ne sont pas codées en base 64. Par conséquent, dans le service Web, vous pouvez lire les valeurs directement, comme indiqué dans l’exemple suivant. Cependant, vous devez utiliser SSL pour les services Web qui utilisent cette fonctionnalité, car les valeurs de mot de passe et de nom d’utilisateur ne sont pas chiffrées.

Pour utiliser des en-têtes SOAP, apportez les modifications suivantes dans le fichier de définition d'application :

  1. Attribuez à la propriété SecondarySsoApplicationId de l’élément LobSystemInstance l’ID d’application cible de l’application du magasin sécurisé qui contient le nom d’utilisateur et le mot de passe.

  2. Définissez les propriétés suivantes de l'élément Method :

    1. SoapHeaderUserNameMemberName: nom de l’en-tête SOAP de nom d’utilisateur que comprend le service Web.

    2. SoapHeaderUserNameMemberFieldName: nom du champ qui contient le nom d'utilisateur.

    3. SoapHeaderPasswordMemberName: nom de l'en-tête SOAP de mot de passe que comprend le service Web.

    4. SoapHeaderPasswordMemberFieldName: nom du champ qui contient le mot de passe.

Notes

BDC prend également en charge la définition du nom d’utilisateur et du mot de passe dans un seul en-tête SOAP. Pour les en-têtes SOAP qui prennent en charge à la fois le nom d’utilisateur et le mot de passe, les valeurs de propriété de métadonnées SoapHeaderUserNameMemberName et SoapHeaderPasswordMemberNamesont les mêmes.

Exemple

<LobSystemInstance Name="ContosoInstance" DefaultDisplayName="SimpleSOAPInstance">
  <Properties>
    <Property Name="LobSystemName" Type="System.String">Contoso</Property> 
    <Property Name="AuthenticationMode" Type="System.String">WindowsCredentials</Property> 
     …
     …
    <Property Name="SecondarySsoApplicationId" Type="System.String">Contoso</Property> 
  </Properties>
</LobSystemInstance>
<Method Name="HelloWorld" DefaultDisplayName="HelloWorld">
   <Properties>
      <Property Name="SoapHeaderUserNameMemberName" Type="System.String">UserNameHeaderValue</Property>
      <Property Name="SoapHeaderUserNameMemberFieldName" Type="System.String">MyValue</Property>
      <Property Name="SoapHeaderPasswordMemberName" Type="System.String">UserPasswordHeaderValue</Property>
      <Property Name="SoapHeaderPasswordMemberFieldName" Type="System.String">MyValue</Property>
   </Properties>
  …
</Method>

Important

Le serveur Web doit prendre en charge les en-têtes SOAP pour être en mesure de les utiliser. En outre, vous devez ajouter l'attribut SOAP à la méthode Web pour chaque en-tête SOAP. L'exemple de code suivant illustre cette opération.

public class Service : System.Web.Services.WebService
{
    public UserNameHeader UserName;
    public UserPasswordHeader Password;

    public Service () { }
    [WebMethod]
    [SoapHeader("UserName", Direction=SoapHeaderDirection.In)]
    [SoapHeader("Password", Direction=SoapHeaderDirection.In)]
    public void HelloWorld() 
    {
        string password = "";
        string userName = "";
        if (UserName != null)
        {
            userName = UserName.MyValue;
        }
        if (Password != null)
        {
            password = Password.MyValue;
        }

        return null;
    }
}

public class UserNameHeader : SoapHeader
{
    public string MyValue;
}

public class UserPasswordHeader : SoapHeader
{
    public string MyValue;
}

Comme vous le savez, pour exécuter les méthodes Web, BDC génère un proxy. Si la méthode Web principale prend en charge les en-têtes SOAP, le proxy qui est généré ressemble à l’exemple de code suivant.

Notes

L'exemple suivant montre uniquement le code pertinent.

public partial class Service : System.Web.Services.Protocols.SoapHttpClientProtocol
{
   private UserPasswordHeader userPasswordHeaderValueField;
   private UserNameHeader userNameHeaderValueField;

   public Service() {}

   public UserPasswordHeader UserPasswordHeaderValue
   {
      get { return this.userPasswordHeaderValueField;  }
      set { this.userPasswordHeaderValueField = value; }
   }

   public UserNameHeader UserNameHeaderValue
   {
      get { return this.userNameHeaderValueField;  }
      set { this.userNameHeaderValueField = value; }
   }

   public void HelloWorld()
   {
      object[] results = this.Invoke("HelloWorld", new object[0]);
      return (results[0]);
   }
}

public partial class UserPasswordHeader : System.Web.Services.Protocols.SoapHeader
{
   private string myValueField;

   public string MyValue
   {
      get { return this.myValueField;  }
      set { this.myValueField = value; }
   }
}

public partial class UserNameHeader : System.Web.Services.Protocols.SoapHeader
{
   private string myValueField;

   public string MyValue
   {
      get { return this.myValueField;  }
      set { this.myValueField = value; }
   }
}

En-têtes SOAP personnalisés

Vous pouvez ajouter des en-têtes SOAP personnalisées avec n’importe quelle méthode de stéréotype pour un LobSystemInstance donné. Avec des en-têtes SOAP personnalisés, BDC remplace les jetons de nom d’utilisateur et de mot de passe par les valeurs stockées dans la banque d’informations sécurisée. Lorsque des en-têtes SOAP personnalisées sont spécifiés dans le modèle, BDC ne vérifie pas que le service Web expose ces en-têtes SOAP. En revanche, vous noterez que lors de l’utilisation d’en-têtes SOAP, BDC exige que les en-têtes SOAP soient définis dans le service Web.

Pour utiliser des en-têtes SOAP personnalisés, apportez les modifications suivantes dans le fichier de définition de l’application :

  1. Attribuez à la propriété SecondarySsoApplicationId de l’élément LobSystemInstance l’ID d’application cible de l’application du magasin sécurisé qui contient le nom d’utilisateur et le mot de passe.

  2. Ajoutez la propriété SoapHeaderXml à l’élément LobSystemInstance. La propriété SoapHeaderXml spécifie à BDC que des en-têtes SOAP personnalisés doivent être envoyés au service Web avec chaque appel.

    Le contenu de la propriété de SoapHeaderXml comprend les en-têtes de nom d’utilisateur et de mot de passe dans un format que le service Web comprend. Les valeurs du nom d’utilisateur et du mot de passe sont représentées par des jetons qui, plus tard, sont remplacés par BDC lorsqu’il récupère ces valeurs du magasin sécurisé avant d’envoyer la demande au service Web.

  3. Attribuez aux valeurs des propriétés Username et Password dans la propriété SoapHeaderXml le jeton qui sera remplacé plus tard par BDC.

  4. Attribuez à la valeur de la propriété SoapHeaderXmlUserNameToken le jeton à remplacer pour la valeur du nom d’utilisateur dans l’en-tête SOAP personnalisé.

  5. Attribuez à la valeur de la propriété SoapHeaderXmlPasswordToken le jeton à remplacer pour la valeur du mot de passe dans l’en-tête SOAP personnalisé.

L’exemple suivant montre ces propriétés dans le fichier de définition de l’application.

<LobSystemInstance Name="Lsi_WithCustomHeaders">
  <Properties>
    <Property Name="WcfAuthenticationMode" Type="System.String">PassThrough</Property>
    <Property Name="WcfEndpointAddress" Type="System.String"> WCF Endpoint Address </Property>
    <Property Name="SecondarySsoApplicationId" Type="System.String">Contoso</Property>
    <Property Name="SsoProviderImplementation" Type="System.String">Microsoft.Office.BusinessData.Infrastructure.SecureStore.LocalSecureStoreProvider, Microsoft.Office.BusinessData, Version=14.0.0.0, Culture=neutral, PublicKeyToken=94de0004b6e3fcc5</Property>
    <Property Name="SoapHeaderXml" Type="System.String">
      &lt;wsse:Security xmlns:wsse="https://schemas.xmlsoap.org/ws/2002/04/secext"&gt;
      &lt;wsse:UsernameToken&gt;
      &lt;wsse:Username&gt;CONTOSO_USERNAME_TOKEN&lt;/wsse:Username&gt;
      &lt;wsse:Password Type="wsse:PasswordText"&gt;CONTOSO_PASSWORD_TOKEN&lt;/wsse:Password&gt;
      &lt;/wsse:UsernameToken&gt;
      &lt;/wsse:Security&gt;
    </Property>
    <Property Name="SoapHeaderXmlUserNameToken" Type="System.String">CONTOSO_USERNAME_TOKEN</Property>
    <Property Name="SoapHeaderXmlPasswordToken" Type="System.String">CONTOSO_PASSWORD_TOKEN</Property>
  </Properties>
</LobSystemInstance>