カスタム HTTP および SOAP ヘッダーのサポート
最終更新日: 2010年4月16日
適用対象: SharePoint Server 2010
この記事の内容
HTTP ヘッダー
SOAP ヘッダー
カスタム SOAP ヘッダー
Web サービスでは、HTTP ヘッダーまたは SOAP ヘッダーを使用して SOAP メッセージに関するアプリケーション固有の情報を提供することができます。たとえば、認証情報や支払い情報を提供できます。BDC により、Web サービスの呼び出しに対してユーザー名とパスワード情報を渡す際にカスタムの HTTP ヘッダーと SOAP ヘッダーを使用できます。
HTTP ヘッダー
BDC では、Secure Store プロバイダーに登録されているユーザー名とパスワードを HTTP ヘッダーとして Web サービスの呼び出しに渡すことができます。HTTP ヘッダーの値 (ユーザー名とパスワード) は、Base 64 エンコードです。このため、Web サービスでは、値をデコードする必要があります。また、ユーザー名とパスワードの値は暗号化されないため、この機能を使用する Web サービスに対して SSL を使用する必要があります。
注意
Web サービスのバインドでは、HTTP トランスポートをサポートする必要があります。HTTP トランスポートは、SOAP ヘッダーを送信するためではなく、HTTP ヘッダーを送信するためにのみ必要です。
HTTP ヘッダーを使用するには、アプリケーション定義ファイルに以下の変更を加える必要があります。
LobSystemInstance 要素の SecondarySsoApplicationId プロパティを、ユーザー名とパスワードを含む Secure Store アプリケーションのターゲット アプリケーション ID に設定します。
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 では、Secure Store の設定情報に登録されているユーザー名とパスワードを SOAP ヘッダーとして Web サービスの呼び出しに渡すことができます。SOAP ヘッダーの値 (ユーザー名とパスワード) は、Base 64 エンコードではありません。このため、Web サービスでは、以下の例に示すように直接この値を読み込むことができます。ただし、ユーザー名とパスワードの値は暗号化されないため、この機能を使用する Web サービスに対して SSL を使用する必要があります。
SOAP ヘッダーを使用するには、アプリケーション定義ファイルに以下の変更を加えます。
LobSystemInstance 要素の SecondarySsoApplicationId プロパティに、ユーザー名とパスワードを含む Secure Store アプリケーションのターゲット アプリケーション ID を設定します。
Method 要素の以下のプロパティを設定します。
SoapHeaderUserNameMemberName: Web サービスで認識できるユーザー名の SOAP ヘッダー名。
SoapHeaderUserNameMemberFieldName: ユーザー名を含むフィールドの名前。
SoapHeaderPasswordMemberName: Web サービスで認識できるパスワードの SOAP ヘッダーの名前。
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>
重要 |
---|
SOAP ヘッダーを使用できるようにするには、Web サーバーが SOAP ヘッダーをサポートしている必要があります。さらに、SOAP 属性を各 SOAP ヘッダーの Web メソッドに追加する必要があります。以下にこのコード例を示します。 |
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 ヘッダーを追加できます。BDC は、カスタム SOAP ヘッダーを使用して、ユーザー名とパスワードのトークンを Secure Store に登録されている値と置換します。カスタム SOAP ヘッダーがモデルで指定されている場合、BDC は、Web サービスがこれらの SOAP ヘッダーを公開するかどうかを検証しません。この動作は、Web サービスに定義されていることを BDC から要求される SOAP ヘッダーを使用する動作と対照的です。
カスタム SOAP ヘッダーを使用するには、アプリケーションの定義ファイルに以下の変更を加えます。
LobSystemInstance 要素の SecondarySsoApplicationId プロパティに、ユーザー名とパスワードを含む Secure Store アプリケーションのターゲット アプリケーション ID を設定します。
SoapHeaderXml プロパティを LobSystemInstance 要素に追加します。SoapHeaderXml プロパティは、BDC に対して、カスタム SOAP ヘッダーがすべての呼び出しで Web サービスに送信される必要があることを指定します。
SoapHeaderXml プロパティの内容は、Web サービスが認識できる形式のユーザー名とパスワードで構成されます。ユーザー名とパスワードの値は、トークンで表されます。このトークンは、BDC が、後で Secure Store から値を取得したときに置換します。その後、要求を Web サービスに送信します。
SoapHeaderXml プロパティにある Username プロパティおよび Password プロパティの値を、後から BDC が置換するトークンに設定します。
SoapHeaderXmlUserNameToken プロパティの値を、カスタム SOAP ヘッダーのユーザー名値を置換するトークンに設定します。
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">
<wsse:Security xmlns:wsse="https://schemas.xmlsoap.org/ws/2002/04/secext">
<wsse:UsernameToken>
<wsse:Username>CONTOSO_USERNAME_TOKEN</wsse:Username>
<wsse:Password Type="wsse:PasswordText">CONTOSO_PASSWORD_TOKEN</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</Property>
<Property Name="SoapHeaderXmlUserNameToken" Type="System.String">CONTOSO_USERNAME_TOKEN</Property>
<Property Name="SoapHeaderXmlPasswordToken" Type="System.String">CONTOSO_PASSWORD_TOKEN</Property>
</Properties>
</LobSystemInstance>