【发布时间】:2010-12-30 12:05:57
【问题描述】:
Windows Server 2003(亚马逊虚拟机)上有一个 Windows 服务。一些应用程序可以与它通信(使用管道,但有一个包装器来做)。它经过测试并且有效。此外,还有一个用 C# (ASP.NET) 编写的 Web 服务,它与提到的 Windows 服务进行通信。当调用 Web 方法时,它会创建一个类的实例并调用一个函数——该函数“连接”到 Windows 服务并向其发布作业。但是,如果在 Web 方法内部创建了一个线程,并且在线程内部调用了“连接”到 Windows 服务的函数 - 连接将失败。与 Windows 服务的连接使用管道。 Web 服务在 IIS7 上工作。值得一提的是,当我在本地 IIS7 上调用 Web 服务上的 Web 方法时,无论是从调试器(由 VS 2010 启动的本地服务器)还是从 IE 都可以在我的本地计算机上运行。在本地所有工作 - 但在亚马逊实例上没有。我不是网络程序员,所以我认为安全性存在一些问题。有什么提示吗?谢谢。
编辑:Uwe 的评论提醒了我 - Web 方法首先尝试使用 http 下载一些文件,并将它们保存到路径 C:\intetpub\wwwroot\files\"。如果文件是从 Web 方法下载的,它可以工作,但是如果从Web Method中创建的另一个线程完成下载将失败。例外是:访问被拒绝。因此,我更改了上述文件夹的安全设置并明确允许由IIS7(IIS_IUSRS)创建的用户读取/写入文件夹,现在文件是可以下载的。看来这些问题的根源是一样的。
编辑:解决方案移至 Will 建议的答案。
【问题讨论】:
-
您能否发布详细信息,“连接失败”的实际表现如何? IE。详细的错误消息、堆栈跟踪、行为等。
-
连接如何失败无关紧要,因为“连接”是函数调用。问题是:如果通信来自执行 Web 方法的同一线程,我可以从 Web 服务与 Windows 服务通信;如果 Web 方法创建一个新线程 - 通信失败。我没有从提到的 Windows 服务收到更多详细信息。由于它是从 Amazon 虚拟机上的同一个线程工作的,而不是如果线程不同,而且即使使用不同的线程它也可以在我的本地计算机上工作,我认为这与安全性或权限有关。谢谢。
-
@Vladimir:如果连接失败的方式无关紧要,为什么不假装它根本没有失败呢?当然是相关的。
-
@John,感谢您的帖子。但是,还有其他一些问题;正如我所说的“连接”只是一个函数调用。是关于安全上下文的东西,最后我发现了问题:在Web Method中创建的线程没有相同的安全上下文,所以我不得不在Web Method中获取它:System.Security.Principal.WindowsIdentity wi = System.Security .Principal.WindowsIdentity.GetCurrent();并将其传递给新线程。所以,显然我没有以正确的方式提出我的问题。现在,问题解决了,这个问题可以结束了。再次感谢。
-
@Vladimir:如果您发布了更多关于您的问题的详细信息,那么您可以发布您的解决方案作为答案。我会赞成它,它会对其他有同样问题的人有用。
标签: c# web-services iis-7 asmx