支持自定义的 HTTP 和 SOAP 标头

上次修改时间: 2010年4月16日

适用范围: SharePoint Server 2010

本文内容
HTTP 标头
SOAP 标头
自定义的 SOAP 标头

对于 Web 服务,您可以使用 HTTP 标头或 SOAP 标头提供有关 SOAP 消息的特定应用程序信息;例如,您可以提供身份验证和付款信息。BDC 支持自定义的 HTTP 标头和 SOAP 标头,以将用户名和密码信息传送到 Web 服务调用。

HTTP 标头

BDC 可以将安全存储提供程序中存储的用户名和密码作为 HTTP 标头发送给 Web 服务调用。HTTP 标头值(即用户名和密码)经过 Base 64 编码。所以在 Web 服务中,需要对值进行解码。另外,因为用户名和密码值未加密,所以您应该对使用该功能的 Web 服务使用 SSL。

备注

Web 服务绑定应支持 HTTP 传输。请注意,这不是发送 SOAP 标头的要求,而只是发送 HTTP 标头的要求。

若要使用 HTTP 标头,必须在应用程序定义文件中进行以下更改:

  1. 将 LobSystemInstance 元素的 SecondarySsoApplicationId 属性设置为包含用户名和密码的安全存储应用程序的目标应用程序 ID。

  2. 使用 Web 服务预期的相应标头名称设置该方法的 HttpHeaderUserName 和 HttpHeaderPassword 属性。

示例

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

SOAP 标头

BDC 还可以将安全存储设置中存储的用户名和密码作为 SOAP 标头发送给 Web 服务调用。SOAP 标头值(用户名和密码)未经过 Base 64 编码。所以在 Web 服务中,您可以直接读取值,如以下示例中所示。不过,因为用户名和密码值未加密,所以您应该对使用该功能的 Web 服务使用 SSL。

若要使用 SOAP 标头,请在应用程序定义文件中进行以下更改:

  1. 使用包含用户名和密码的安全存储应用程序的目标应用程序 ID 设置 LobSystemInstance 元素的 SecondarySsoApplicationId 属性。

  2. 设置 Method 元素的下列属性:

    1. SoapHeaderUserNameMemberName: Web 服务能理解的用户名 SOAP 标头的名称。

    2. SoapHeaderUserNameMemberFieldName: 包含此用户名的字段名称。

    3. SoapHeaderPasswordMemberName: Web 服务能理解的密码 SOAP 标头的名称。

    4. SoapHeaderPasswordMemberFieldName: 包含此密码的字段名称。

备注

BDC 还支持在单个 SOAP 标头中设置用户名和密码。对于既支持用户名又支持密码的 SOAP 标头来说,SoapHeaderUserNameMemberName 和 SoapHeaderPasswordMemberName 的元数据属性值是相同的。

示例

<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>
重要注释重要说明

Web 服务器必须支持 SOAP 标头,才能使用它们。此外,您应该在每个 SOAP 标头的 Web 方法中添加 SOAP 属性。请参见下面的代码示例。

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

正如您所了解的,为执行 Web 方法,BDC 会生成代理。如果后端 Web 方法支持 SOAP 标头,则所生成的代理如以下代码示例所示。

备注

下列示例只显示了相关代码。

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

自定义的 SOAP 标头

您可以使用给定 LobSystemInstance 的任何构造型方法来添加自定义的 SOAP 标头。对于自定义的 SOAP 标头,BDC 将使用安全存储中存储的值替换用户名和密码标记。在模型中指定自定义的 SOAP 标头后,BDC 不会验证 Web 服务是否公开了这些 SOAP 标头。请注意,此行为与 BDC 要求在 Web 服务中定义 SOAP 标头时使用 SOAP 标头的行为相反。

若要使用自定义的 SOAP 标头,请在应用程序定义文件中进行以下更改:

  1. 使用包含用户名和密码的安全存储应用程序的目标应用程序 ID 设置 LobSystemInstance 元素的 SecondarySsoApplicationId 属性。

  2. 将 SoapHeaderXml 属性添加到 LobSystemInstance 元素。SoapHeaderXml 属性为 BDC 指定每次调用都需要将自定义的 SOAP 标头发送给 Web 服务。

    SoapHeaderXml 属性的内容包括 Web 服务能理解的格式的用户名和密码标头。用户名和密码的值由稍后被 BDC(在向 Web 服务发送请求之前从安全存储检索这些值时)替换的标记表示。

  3. 将 SoapHeaderXml 属性中的 Username 和 Password 属性的值设置为将稍后由 BDC 替换的标记。

  4. 将 SoapHeaderXmlUserNameToken 属性的值设置为要替换为自定义的 SOAP 标头中的用户名值的标记。

  5. 将 SoapHeaderXmlPasswordToken 属性的值设置为要替换为自定义的 SOAP 标头中的密码值的标记。

下面的示例演示应用程序定义文件中的这些属性。

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