2

MTAの代わりにSTAとして実行するようにREST (WCF) サービスを構成することはできますか?

これは、従来の COM オブジェクトを実行するために必要なアプローチです。ASMX Web サービスを MTA ではなく STA として実行するように構成するには、HTTPHandler を使用して Web サービスを強制的に STA として実行する回避策を利用できます。

Jeff Prosise による記事 ( http://msdn.microsoft.com/en-us/magazine/cc163544.aspx ) では、回避策とその適用方法について詳しく説明しています。同じ HTTPHandler を REST ベースの WCF サービスに適用すると ( Visual Studio で [ Create New ADO.NET Data Service ] を使用)、WebServiceHandlerFactory が呼び出された時点でエラーが発生します (HTTPContext、URL などが渡されます)。

ハンドラーは ASMX Web サービスに対して機能し、スレッド モデルを STA として返す WebMethod を追加できます。ただし、ASPCompatibility を (web.configクラス レベルでもクラス レベルでも) 設定した後でも、REST サービスを使用しようとすると、カスタム HTTPHandler は常に同じポイントでエラーを生成します。いくつかの「サービス オペレーター」メソッドで基本的な REST サービスを使用しているため、エンドポイントは構成していません。エラーは次のとおりです。

タイプ 'System.Web.Compilation.BuildResultCustomString' のオブジェクトをタイプ 'System.Web.Compilation.BuildResultCompiledType' にキャストできません。

4

2 に答える 2

0

私は反対方向から来ています (STA COM を MTA に変換しようとしています)。サービス インスタンス内で COM をインスタンス化し、COM が適切なレジストリ エントリを持つ適切な STA である場合、それは自動的に行われると思います。これは私にとってはうまくいった方法であり、この COM 用に少なくとも 5 つのラッパーを作成しました。

スレッドを手動で作成する場合は、SetApartmentStateを使用することをお勧めします。

于 2014-04-08T00:49:43.463 に答える