ASMX Web服务问题在单独的线程中与Windows服务进行通信

时间:2010-12-30 12:05:57

标签: c# web-services iis-7 asmx

Windows Server 2003(Amazon Virtual Machine)上有Windows服务。一些应用程序可以与它通信(使用管道,但有一个包装器来做)。它经过测试并且有效。此外,还有一个用C#(ASP.NET)编写的Web服务,它与提到的Windows服务进行通信。调用Web方法时,它会创建一个类的实例并调用一个函数 - 该函数“连接”到Windows服务并向其发布作业。但是,如果在Web方法中创建了一个线程,并且在线程内部调用了“连接”到Windows服务的功能 - 连接失败。与Windows服务的连接使用管道。 Web服务适用于IIS7。值得一提的是,所有这些都可以在我的本地机器上运行,可以是调试器(由VS 2010启动的本地服务器),也可以是当我在本地IIS7上运行的Web服务上调用Web方法时的IE。在本地所有作品 - 但在亚马逊实例上没有。我不是网络程序员,所以我认为安全性存在一些问题。任何提示?感谢。

编辑:Uwe的评论提醒我 - Web方法首先尝试使用http下载一些文件并将它们保存到路径C:\ intetpub \ wwwroot \ files \“。如果从web方法下载文件,它可以工作,但是如果从Web方法中创建的另一个线程完成下载就会失败。例外情况是:访问被拒绝。所以,我更改了上述文件夹的安全设置并明确允许IIS7创建的用户(IIS_IUSRS)读取/写入文件夹,现在文件可以下载。似乎这些问题的来源是一样的。

编辑:解决方案转移到Will的建议答案。

1 个答案:

答案 0 :(得分:2)

好的,找到了解决方案,正如威尔所建议的那样,我会在这里发布,作为我自己问题的答案。所以,解决方案:

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

[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();
}

这就是全部。感谢那些评论我的问题的人,我希望它对其他人有用。