Compartir a través de


Compatibilidad con encabezados HTTP y SOAP personalizados

Última modificación: viernes, 16 de abril de 2010

Hace referencia a: SharePoint Server 2010

En este artículo
Encabezados HTTP
Encabezados SOAP
Encabezados SOAP personalizados

Con los servicios web, puede usar encabezados HTTP o SOAP para proporcionar información específica de la aplicación acerca del mensaje SOAP; por ejemplo, puede informar de la autenticación y de los pagos. BDC admite encabezados HTTP y SOAP personalizados para pasar la información de nombre de usuario y contraseña a las llamadas a servicios web.

Encabezados HTTP

BDC puede enviar el nombre de usuario y la contraseña almacenados en el proveedor de almacenamiento seguro como encabezados HTTP a las llamadas a servicios web. Los valores de encabezado HTTP (es decir, el nombre de usuario y la contraseña) están codificados en base 64, por lo que deberá descodificar los valores en el servicio web. Además, deberá usar SSL para los servicios web que usan esta característica, ya que los valores de nombre de usuario y contraseña no están cifrados.

Nota

El enlace del servicio web debe admitir el transporte HTTP. Observe que esto no es un requisito para enviar encabezados SOAP, sino solo para enviar encabezados HTTP.

Para usar encabezados HTTP, debe realizar los siguientes cambios en el archivo de definición de aplicación:

  1. Establezca la propiedad SecondarySsoApplicationId del elemento LobSystemInstance en el identificador de la aplicación de destino de la aplicación de almacenamiento seguro que contiene el nombre de usuario y la contraseña.

  2. Establezca las propiedades HttpHeaderUserName y HttpHeaderPassword del método con los nombres de encabezado respectivos que espera el servicio web.

Ejemplo

<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>

Encabezados SOAP

BDC también puede enviar el nombre de usuario y la contraseña almacenados en la configuración de almacenamiento seguro como encabezados SOAP a las llamadas a servicios web. Los valores de encabezado SOAP (nombre de usuario y contraseña) no están codificados en base 64, por lo que podrá leer los valores en el servicio web directamente, como se aprecia en el siguiente ejemplo. No obstante, debe usar SSL para los servicios web que usan esta característica, ya que los valores de nombre de usuario y contraseña no están cifrados.

Para usar encabezados SOAP, realice los siguientes cambios en el archivo de definición de aplicación:

  1. Establezca la propiedad SecondarySsoApplicationId del elemento LobSystemInstance con el identificador de la aplicación de destino de la aplicación de almacenamiento seguro que contiene el nombre de usuario y la contraseña.

  2. Establezca las siguientes propiedades del elemento Method:

    1. SoapHeaderUserNameMemberName: nombre del encabezado SOAP de nombre de usuario que comprende el servicio web.

    2. SoapHeaderUserNameMemberFieldName: nombre del campo que contiene el nombre de usuario.

    3. SoapHeaderPasswordMemberName: nombre del encabezado SOAP de contraseña que comprende el servicio web.

    4. SoapHeaderPasswordMemberFieldName: nombre del campo que contiene la contraseña.

Nota

BDC también admite el establecimiento del nombre de usuario y la contraseña en un único encabezado SOAP. En los encabezados SOAP que admiten tanto el nombre de usuario como la contraseña, los valores de las propiedades de metadatos SoapHeaderUserNameMemberName y SoapHeaderPasswordMemberName son los mismos.

Ejemplo

<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>
Nota importanteImportante

El servidor web debe admitir encabezados SOAP para poder usarlos. Además, debe agregar el atributo SOAP al método web para cada encabezado SOAP. El siguiente ejemplo de código muestra cómo hacerlo.

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;
}

Como sabe, BDC genera un proxy para ejecutar métodos web. Si el método web back-end admite encabezados SOAP, el proxy generado se parece al siguiente ejemplo de código.

Nota

En el ejemplo siguiente, se muestra sólo el código relevante.

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; }
   }
}

Encabezados SOAP personalizados

Puede agregar encabezados SOAP personalizados con cualquier método de estereotipo de una determinada LobSystemInstance. Con los encabezados SOAP personalizados, BDC reemplazará los tokens de nombre de usuario y contraseña por los valores almacenados en almacenamiento seguro. Si se especifican encabezados SOAP personalizados en el modelo, BDC no comprueba si el servicio web expone estos encabezados. Tenga en cuenta que este comportamiento contrasta con el uso de encabezados SOAP donde BDC requiere que los encabezados SOAP se definan en el servicio web.

Para usar encabezados SOAP personalizados, realice los siguientes cambios en el archivo de definición de aplicación:

  1. Establezca la propiedad SecondarySsoApplicationId del elemento LobSystemInstance con el identificador de la aplicación de destino de la aplicación de almacenamiento seguro que contiene el nombre de usuario y la contraseña.

  2. Agregue la propiedad SoapHeaderXml al elemento LobSystemInstance. Esta propiedad especifica a BDC que los encabezados SOAP personalizados se deben enviar al servicio web con todas las llamadas.

    El contenido de la propiedad SoapHeaderXml consta de los encabezados de nombre de usuario y contraseña en un formato que el servicio web puede comprender. Los valores de nombre de usuario y contraseña están representados por tokens que luego BDC reemplaza cuando los obtiene del almacenamiento seguro antes de enviar la solicitud al servicio web.

  3. Establezca los valores de las propiedades Username y Password en la propiedad SoapHeaderXml en el token que más adelante BDC reemplazará.

  4. Establezca el valor de la propiedad SoapHeaderXmlUserNameToken en el token que va a reemplazar el valor de nombre de usuario en el encabezado SOAP personalizado.

  5. Establezca el valor de la propiedad SoapHeaderXmlPasswordToken en el token que va a reemplazar el valor de contraseña en el encabezado SOAP personalizado.

El siguiente ejemplo muestra estas propiedades en el archivo de definición de la aplicación.

<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>