WCF 受信アダプターで WCF サービスを公開する場合の考慮事項
このトピックでは、WCF 受信アダプターで WCF サービスを公開する際に考慮する必要がある情報を示します。 WCF アダプターを使用してサービスを公開すると、サービスを標準の WCF サービスのように WCF クライアントから呼び出すことができます。
In-Process ホスティング
btsntsvc.exe BizTalk Serverプロセス空間内で受信場所をホストすると、開発とデプロイが簡素化される利点があります。 さらに、IIS でのホスティングよりも多くのホスト インスタンスを作成して、BizTalk Serverの高可用性と負荷分散機能を活用します。 IIS のBizTalk Server プロセスの外部でホストする方法については、「分離 WCF 受信アダプターの IIS の構成」を参照してください。
WCF アダプター (WCF-NetMsmq 受信アダプター以外) によって公開された WCF サービスの IsOneWay プロパティを false に設定する
WCF アダプターと共に発行された WCF サービスの System.ServiceModel.OperationContractAttribute.IsOneWay プロパティ ( true に設定されている WCF-NetMsmq 受信アダプターで発行されたサービスを除く) は、一方向の受信場所でも false に設定されます。 IsOneWay プロパティが false に設定されている場合、void を返すメソッドであっても、応答メッセージが返されます。 この場合、インフラストラクチャは、空のメッセージを作成して送信することで、メソッドが戻ったことを呼び出し元に示します。 この方法により、インフラストラクチャはサービス操作によってスローされた例外をクライアントに返すことができます。
IsOneWay が false である WCF アダプター (WCF-NetMsmq 受信アダプターを除く) で公開された WCF サービスを使用するには、クライアント側の IsOneWay プロパティを次のように false に設定する必要があります。
[ServiceContract(Namespace="Microsoft.WCF.Documentation")]
public interface ISampleService{
[OperationContract(IsOneWay=false, ReplyAction="*",Action="…"]
string SampleMethod(string msg);
}
Note
IsOneWay プロパティの既定値は false であるため、コードで プロパティを指定する必要はありません。
一方向の受信場所で公開される WCF サービスを使用する場合、クライアント側の OperationContractAttribute の ReplyAction プロパティを "*" (アスタリスク) に設定する必要がある
System.ServiceModel.OperationContractAttribute の System.ServiceModel.OperationContractAttribute.ReplyAction プロパティをクライアント側で使用して、WCF サービスからの応答メッセージの SOAP アクションの値を指定できます。
応答メッセージのアクション ヘッダーに特定の値を指定する (クライアントにこれが応答であることと、実行するアクションを伝えるため) 以外に、文字列 "*" (アスタリスク) を指定することもできます。 クライアント アプリケーションでアスタリスクを指定することで、サービスが送信する応答メッセージの応答アクションを検証しないようにクライアントに指示します。
一方向の受信場所によって発行された WCF サービスを使用するには、WCF サービスのプロキシ メソッドが void を返す必要があります。その場合、プロキシ メソッドは、WCF サービスが空のメッセージを送信して、メソッドが返されたことを呼び出し元に示します。 プロキシ メソッドがこの空のメッセージを受信するには、OperationContractAttribute の ReplyAction プロパティを次のように "*" (アスタリスク) に設定する必要があります。
[ServiceContract(Namespace="Microsoft.WCF.Documentation")]
public interface ISampleService{
[OperationContract(IsOneWay=false, ReplyAction="*",Action="…"]
string SampleMethod(string msg);
}
Note
WCF-NetMsmq アダプターでは WCF クライアントで IsOneWay プロパティを true に設定する必要があるため、WCF-NetMsmq アダプターの ReplyAction プロパティを "*" (アスタリスク) に設定する必要はありません。
分離ホスト インスタンスは 1 つのアダプターでのみ実行できる
分離ホスト インスタンスは、1 つのアダプターでのみ実行できます。 1 つの分離ホストで HTTP、SOAP、WCF などの複数の分離アダプターの受信ハンドラーを構成する場合、複数のアプリケーション プール (各アダプターに 1 つのアプリケーション プール) を作成する必要があります。 BizTalk 分離ホストの詳細については、「 Web サービスの有効化」を参照してください。
XML 以外のコンテンツを応答メッセージとして送信する場合は、[テンプレート -- テンプレートで指定されたコンテンツ] オプションを使用する
[本文] の WCF アダプター -- BizTalk 応答メッセージ本文 (既定値) オプションでは、文字データやビットマップ イメージなどの XML 以外のメッセージを送信することはできません。 XML 以外のメッセージを送信するには、WCF アダプターの テンプレート オプションで指定されたテンプレート -- コンテンツ を使用できます。 テンプレートの使用方法の詳細については、「 WCF アダプターのメッセージ本文の指定」を参照してください。
WCF サービス公開ウィザードで公開した WCF サービスに対してアクセス許可を設定する
Windows Server 2008 SP2 または Windows Server 2008 R2 プラットフォームで WCF サービス発行ウィザードで作成された ASP.NET アプリケーションを使用すると、WCF サービスの呼び出し中に DLL へのアクセスに関連するエラーが発生する可能性があります。 通常、これらのエラーは、既定の Windows Server 2008 SP2 と Windows Server 2008 R2 のセキュリティに関する問題に関連しています。 これらのエラーの詳細については、 のヘルプおよびサポート Web サイト https://go.microsoft.com/fwlink/?LinkId=43659の「クライアント アプリケーションが Web サービスを呼び出したときに"System.IO.FileNotFoundException" エラーが発生する」という Microsoft のヘルプとサポートに関する記事を参照してください。
BizTalk Server では、インプロセス ホストと分離ホストのどちらがサービスを実行するかに関係なく、WCF サービスを実行するプロセスに適切なアクセス許可が付与されることが必要です。 Windows Server 2008 SP2 と Windows Server 2008 R2 では、分離ホストの既定の Windows グループは分離ホスト ユーザー グループであるため、分離ホスト ユーザー グループにアクセス許可を追加すると、この問題が解決されます。
分離ホスト ユーザー グループにアクセス許可を追加するには
Microsoft Windows エクスプローラーで、%windir%\temp ディレクトリを探します。
%windir%\temp を右クリックし、[ プロパティ] をクリックします。
[ プロパティ ] ダイアログ ボックスで、[ セキュリティ ] タブをクリックします。
[ 追加] をクリックし、[ 分離ホスト ユーザー グループ] を選択し、[OK] をクリック します。
WCF-NetMsmq アダプターを使用して WCF 受信場所のアクセス許可を設定する
NetMsmqBinding を使用する WCF クライアントは、WCF-NetMsmq アダプターによって公開された WCF サービスにメッセージを送信する場合、サービスのキュー マネージャーによって管理されているターゲット キューにこのメッセージの宛先を指定します。 クライアント側のキュー マネージャーは、メッセージを転送キュー (送信キュー) に送ります。 転送キューは、ターゲット キューに転送するためのメッセージを格納する、クライアント側キュー マネージャー上のキューです。
サービスのキュー マネージャーは、それが所有するターゲット キューに宛先指定されたメッセージを受け入れて、格納します。 次に、サービスがターゲット キューからの読み取り要求を行い、キュー マネージャーがメッセージをサービスに配布します。 そのため、受信場所をホストする BizTalk ホスト インスタンスのサービス アカウントには、ターゲット キューから読み取るためのアクセス許可を与える必要があります。
SOAP Body 要素のコンテンツに文字データが含まれた SOAP メッセージを受信するには、空のボディ パス式を使用する
次の例に示すように、WCF 受信アダプターが SOAP Body 要素の内容に文字データを含む BizTalk メッセージを受信応答メッセージから作成するには、WCF アダプタートランスポートのプロパティ ダイアログ ボックスの [メッセージ] タブの [本文パス式] テキスト ボックスを空のままにする必要があります。
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
...
</s:Header>
<s:Body>Contoso</s:Body>
</s:Envelope>
[封筒] または [本文] オプションを選択した場合、アダプターは前の受信メッセージから BizTalk メッセージを作成できません。 受信 SOAP マーシャリング プロセスでエラーとなったメッセージは保留されないので、このメッセージは保留されません。 [ メッセージ ] タブで本文パス式を使用する方法の詳細については、「 WCF アダプターのメッセージ本文を指定する」を参照してください。
Note
BTSNTSvc.exe.config ファイルを構成すると、Windows SDK の TraceViewer ツール (SvcTraceViewer.exe) を使用できます。 Windows SDK の詳細については、「Windows SDK の新機能」 https://go.microsoft.com/fwlink/?LinkId=75219を参照してください。 TraceViewer ツールの詳細については、「TraceViewer ツール (SvcTraceViewer.exe)」 https://go.microsoft.com/fwlink/?LinkId=75218を参照してください。
他のスキーマを参照するスキーマの使用
再定義、インクルード、インポート要素は、スキーマが大きく複雑になった場合、または異なる種類のインスタンス メッセージを表すスキーマに共通する部分がある場合に使用できます。 小さいスキーマを、取引先と交換するインスタンス メッセージの構造を最終的に定義するスキーマに結合すると便利な場合があります。 BizTalk WCF サービス公開ウィザードを使用して、これらのスキーマを WCF サービスとして公開できます。
BizTalk プロジェクトから WCF サービスを使用するために必要な BizTalk アイテムを作成するには、BizTalk WCF サービス使用ウィザードを使用する必要があります。 .NET アプリケーションから WCF サービスを使用するには、ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) を使用して、WCF サービスのプロキシ クラスを作成する必要があります。 他のスキーマを参照するスキーマの使用方法の詳細については、「他のスキーマを 使用するスキーマ 」および「他のスキーマ を使用するスキーマを作成する方法」を参照してください。 Svcutil.exe の詳細については、「サービス モデル メタデータ ユーティリティ ツール (Svcutil.exe)」 https://go.microsoft.com/fwlink/?LinkID=74696を参照してください。
次の表は、他のスキーマを使用するスキーマを使って公開された WCF サービスを使用するときに理解しておく必要がある制限と注意点を示しています。
XML スキーマ要素 | BizTalk WCF サービス公開ウィザードで公開した WCF サービスの使用 | .NET アプリケーションでホストされる WCF サービスの使用 |
---|---|---|
<import> | BizTalk WCF サービス使用ウィザードと Svcutil.exe の両方でサポート | BizTalk WCF サービス使用ウィザードと Svcutil.exe の両方でサポート |
<include> | BizTalk WCF サービス使用ウィザードと Svcutil.exe 注の両方でサポートされています 。 Svcutil.exe プロキシ クラスの作成時に警告メッセージが表示されることがあります。 | BizTalk WCF サービス使用ウィザードと Svcutil.exe 注の両方でサポートされています 。 Svcutil.exe プロキシ クラスの作成時に警告メッセージが表示されることがあります。 |
<redefine> | - BizTalk WCF サービス使用ウィザードでサポートされます - Svcutil.exe による制限付きサポート 注: Svcutil.exe は、 再定義 要素に対して、XSD.exe と同じ制限があります。 |
BizTalk WCF サービス使用ウィザードと Svcutil.exe 注の両方でサポートされています 。 Svcutil.exe プロキシ クラスの作成時に警告メッセージが表示されることがあります。 |
Note
Svcutil.exe、 include 要素と 再定義 要素を使用してスキーマを使用して、発行された BizTalk WCF サービスに対してプロキシ クラスを作成するときに警告メッセージが表示されることがあります。 たとえば、"グローバル要素は既に宣言されています。" などです。
サービス エンドポイント アドレスのコンピューター名の部分を変更した場合、インプロセス WCF 受信場所が無効になっていないことを確認する
実行中のインプロセス WCF 受信場所の [アドレス (URI)] テキスト ボックスのコンピューター名部分を変更する場合は、BizTalk 管理コンソールを使用して、受信場所がまだ実行されているかどうかをチェックすることをお勧めします。 たとえば、受信アダプター net.tcp://Your Computer Name/<samplepath WCF-NetTcp を使用してサービス エンドポイント アドレスを net.tcp://localhost/samplepath に変更した場合、受信場所は Service.InvalidOperationException で無効になることがあります。> パスの部分を変更せずに、サービス エンドポイント アドレスのコンピューター名の部分のみを変更した場合は、受信場所が無効になっていないことを確認し、必要に応じて有効にします。
トランザクション プロトコルを使用してリモートの WCF 受信場所と通信するクライアント コンピューターで、適切な MSDTC セキュリティ構成オプションを設定する
WCF-NetTcp、WCF-WSHttp、および WCF-NetNamedPipe 受信アダプターは、WCF クライアントが WS-AtomicTransaction および OleTransaction トランザクション プロトコルを使用して管理するトランザクション調整プロセスに参加できます。 メッセージは、送信先の受信場所に送信したり、トランザクション プロトコルを使用してトランザクション コンテキストでメッセージ ボックス データベースから削除できます。
トランザクション プロトコルを使用してリモート WCF 受信場所と通信するには、WCF クライアント コンピューターで MSDTC セキュリティ構成 オプションを適切に構成する必要があります。 次の表に、[MSDTC セキュリティ構成 ] ダイアログ ボックスで使用できるオプションに必要な値を示します。
構成オプション | 既定値 | 推奨値 |
---|---|---|
ネットワーク DTC アクセス | 無効 | Enabled |
送信を許可する | 無効 | Enabled |
相互認証を必要とする | 有効 | 対応するリモート受信場所が Windows Server 2003 SP1 または SP2 を実行しており、 相互認証が必須で構成されている場合に有効になります。 |
着信呼び出し側には認証を必要とする | 無効 | クラスター上で MSDTC を実行している場合は有効 |
これらの変更を適用した後で、MSDTC サービスを再開する必要があります。
[MSDTC セキュリティ構成] ダイアログ ボックスにアクセスするには、次の手順に従います。
[ スタート] をクリックし、[ 実行] をクリックし、「 dcomcnfg 」と入力して Component Services 管理コンソールを起動します。
[コンポーネント サービス] を展開し、[コンピューター] を展開し、[マイ コンピューター] を右クリックして、[プロパティ] をクリックします。
[ マイ コンピューターのプロパティ ] ダイアログ ボックスで、[ MSDTC ] タブをクリックし、[ セキュリティ構成 ] をクリックして [ セキュリティ構成 ] ダイアログ ボックスを表示します。
BizTalk WCF サービス公開ウィザードを使用する場合の SOAP ラッパーについての説明
WCF サービス発行ウィザードを使用して、オーケストレーションが Windows Communication Foundation (WCF) サービスとして公開されると、ラッパーが生成されます。 このラッパーは、XML メッセージでメッセージの送信先のポートのメソッド名を使用します。 このラッパーは Microsoft SOAP エンベロープの既定の設定です。 これにより、WCF は、アダプターによってエンドポイントに送信される 1 つの WCF メッセージでマルチパート SOAP メッセージをラップできます。
ベスト プラクティスとして、送信側はラッパーを使用し、受信側はラッパーを使用する必要があります。または、送信側はラッパーを使用せず、受信側は生の WCF メッセージを期待する必要があります。 ラッパーを使用するかどうかについてあらかじめ合意できていないと、送信内容と受信内容が一致しないという問題が発生する可能性があります。