gpt4 book ai didi

c# - ASMX Web 服务问题在单独的线程中与 Windows 服务通信

转载 作者:行者123 更新时间:2023-11-30 17:19:50 25 4
gpt4 key购买 nike

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 方法中创建的另一个线程完成的,则下载失败。异常是:访问被拒绝。因此,我更改了上述文件夹的安全设置,并明确允许 IIS7 (IIS_IUSRS) 创建的用户读/写该文件夹,现在文件可以下载,看来这些问题的根源都是一样的。

编辑:解决方案已移至对 Will 的建议的回答。

最佳答案

好的,伙计们,解决方案已经找到,正如 Will 所建议的那样,我将把它发布在这里,作为对我自己的问题的回答。所以,解决方案:

问题是因为 Web Method 创建的线程必须被模拟。所以,在调用方方法中,我必须像这样:

[WebMethod]
public void Fnc()
{
...
...
System.Security.Principal.WindowsIdentity wi = System.Security.Principal.WindowsIdentity.GetCurrent();
System.Threading.Thread postJobThread = new Thread(PostJobThread);
postJobThread.Start(wi);
...
}

...

private void PostJobThread(object ob)
{
System.Security.Principal.WindowsIdentity wi = (System.Security.Principal.WindowsIdentity)ob;
System.Security.Principal.WindowsImpersonationContext ctx = wi.Impersonate();

...
// Do some job which couldn't be done in this thread
...
// OK, job is finished
if(ctx != null)
ctx.Undo();
}

就是这样。感谢对我的问题发表评论的人,我希望它对其他人有用。

关于c# - ASMX Web 服务问题在单独的线程中与 Windows 服务通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4562442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com