C#中的WCF服务是否需要STAThread?

时间:2012-08-07 14:01:48

标签: c# multithreading wcf silverlight exception-handling

我度过了非常沮丧的一天来调试Hello World Silverlight Web应用程序。该应用程序通过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根文件夹。但这并没有消除错误。

幸运的是,我偶然看到了在线WCF服务的代码,该代码在Web服务的 program.cs 中的 main 函数之前有一个“[STAThread]”关键字。所以我做了同样的事情,即在main方法之前添加了[STAThread]。这个简单的技巧神奇地解决了这个问题。但我不知道这背后的机制。任何人都可以向我解释一下吗?

BTW:另一个问题是,当我在localhost上托管服务时,会出现上述错误,即silverlight应用程序无法与服务进行通信。但是控制台应用程序可以成功与服务通信。我想知道这是否是因为本地主机禁用了silverlight应用程序所需的某些系统服务,以便在服务器提供时使用WCF。

1 个答案:

答案 0 :(得分:0)

我不是这里的专家,但当您的(托管)代码与COM互操作时,有两种类型的“公寓”,即 MTA (“多线程公寓”)和 STA (“单线程公寓”)。如果未指定任何内容,则当您的应用程序启动时,Main方法的线程将具有MTA状态。通过指定STAThread,您可以强制该线程获得STA状态。

如果您的应用程序稍后在创建更多线程,则可以使用枚举ApartmentState设置其状态。

现在,我不能说你的应用程序中需要STA状态的是什么,我甚至不知道是否所有WCF应用程序都需要在STA线程中运行。