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

本文关键字:STAThread 是否 服务 中的 WCF | 更新日期: 2024-11-05 04:13:20

我花了非常沮丧的一天来调试一个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服务的程序中的主要功能.cs前面有一个"[STAThread]"关键字。所以我做了同样的事情,即在主方法之前添加了 [STAThread]。这个简单的技巧神奇地治愈了这个问题。但我不知道这背后的机制。有人可以向我解释吗?

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

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

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

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

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