我花了非常沮丧的一天来调试应用程序。该应用程序通过(WCF)与远程服务器上的Hello服务进行通信。
一开始,应用程序不断地给我以下错误:
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.在google上搜索了一段时间之后,我想我遇到了一个常见的跨域问题。因此,我尝试将跨站点策略文件添加到web根文件夹中。但这并没有消除错误。
幸运的是,我意外地看到了WCF的代码,它在web服务的STAThread中的主函数前面有一个"STAThread“关键字。因此,我做了同样的事情,即在主方法之前添加了STAThread。这个简单的把戏神奇地治愈了这个问题。但我不知道这背后的机制。有人能解释给我听吗?
顺便说一句:另一个问题是,当我在本地主机上承载服务时,上面的错误又出现了,即silverlight应用程序无法与服务通信。但是控制台应用程序可以成功地与服务通信。我想知道这是否是因为本地主机禁用了silverlight应用程序所需的某些系统服务,以便在服务器提供WCF时使用WCF。
发布于 2012-08-07 14:27:46
我不是这里的专家,但是当您的(托管)代码与COM交互时,有两种类型的“公寓”,即MTA (“多线程公寓”)和STA (“单线程公寓”)。如果未指定任何内容,则当应用程序启动时,Main方法的线程将具有MTA状态。通过指定STAThread,可以强制该线程获取STA状态。
如果在应用程序的后面创建更多线程,则可以使用枚举ApartmentState设置它们的状态。
现在,我不能说在您的应用程序中需要STA状态是什么,我甚至不知道是否所有WCF应用程序都需要在STA线程中运行。
https://stackoverflow.com/questions/11847700
复制相似问题