1

Hello World Silverlight Web アプリケーションをデバッグするのに、本当にイライラする 1 日を過ごしました。このアプリは、Windows Communication Foundation (WCF) を介して、リモート サーバーでホストされている Hello World Web サービスと通信します。

最初、このアプリは常に次のエラーを表示しました。

An error occurred while trying to make a request to URI 
'http://remoteServer/service'. This could be due to attempting to 
access a service in a cross-domain way without a proper cross-domain policy 
in place, or a policy that is unsuitable for SOAP services. You may need to 
contact the owner of the service to publish a cross-domain policy file and 
to ensure it allows SOAP-related HTTP headers to be sent.

しばらくグーグルで検索した後、よくあるクロスドメインの問題に出くわしたと思いました。そこで、クロスサイト ポリシー ファイルを Web ルート フォルダーに追加しようとしました。しかし、これはエラーを殺しませんでした。

幸いなことに、Web サービスのprogram.csでメイン関数の前に "[STAThread]" キーワードがある WCF サービスのコードを偶然オンラインで見ました。つまり、メイン メソッドの前に [STAThread] を追加しました。この簡単なトリックで、魔法のように問題が解決しました。しかし、この背後にあるメカニズムについてはわかりません。誰でも私に説明できますか?

ところで: 別の問題は、localhost でサービスをホストすると、上記のエラーが返されることです。つまり、Silverlight アプリがサービスと通信できません。ただし、コンソール アプリケーションはサービスと正常に通信できます。これは、サーバーが提供している間に WCF を操作するために、Silverlight アプリが必要とするシステム サービスをローカル ホストが無効にするためではないかと考えています。

4

1 に答える 1

0

ここでは専門家ではありませんが、(マネージ) コードがCOMと相互運用する場合、MTA (「マルチスレッド アパートメント」) とSTA (「シングルスレッド アパートメント」) の 2 種類の「アパートメント」があります。何も指定しない場合、アプリケーションの起動時に、Mainメソッドのスレッドは MTA 状態になります。STAThreadを指定することで、そのスレッドに STA 状態を強制的に取得させます。

後でアプリケーションでさらにスレッドを作成する場合は、列挙型ApartmentStateを使用してスレッドの状態を設定できます。

さて、あなたのアプリケーションで STA 状態を必要とするものが何であるかはわかりません。また、すべての WCF アプリケーションを STA スレッドで実行する必要があるかどうかさえわかりません。

于 2012-08-07T14:27:46.653 に答える