2014-09-23 87 views
1

我有一个使用Forms Authentication模式的.Net应用程序,它有一个调用异步任务的函数。以下是该任务的片段:线程任务不在IIS中执行

Task.Factory.StartNew(() => { UploadFunction(); }, tokenSource.Token, TaskCreationOptions.LongRunning,TaskScheduler.Default); 

当我在Visual Studio IDE上进行测试时,线程正常工作。问题是当我部署它时,线程任务似乎被跳过或不被系统执行。

我读过的物品,这可以通过权限IIS引起:

http://codemine.net/post/Thread-Not-working-in-Aspnet-When-deployed-to-IIS

调整在表单认证被实现上述文章的溶液,以下是用于该代码:

[System.Runtime.InteropServices.DllImport("advapi32.dll", EntryPoint = "LogonUser")] 
private static extern bool LogonUser(
     string lpszUsername, 
     string lpszDomain, 
     string lpszPassword, 
     int dwLogonType, 
     int dwLogonProvider, 
     ref IntPtr phToken); 

    public JsonResult uploadimages(){ 

     try{ 

      IntPtr token = new IntPtr(0); 
         token = IntPtr.Zero; 

         bool returnValue = LogonUser("Administrator", "WIN-82CH4949B3Q", "Neuron14", 
             3, 
             0, 
             ref token); 

      WindowsIdentity newId = new WindowsIdentity(token); 
      WindowsImpersonationContext impersonatedUser = newId.Impersonate(); 

      var task2 =  Task.Factory.StartNew(() => { UploadFunction(); }, tokenSource.Token, TaskCreationOptions.LongRunning,TaskScheduler.Default); 

      impersonatedUser.Undo(); 

      return Json(new { message = "Success" }, "text/plain; charset=utf-8"); 

     } 

     catch (ex Exception) 
     { 
      return Json(new { error= ex.Message }, "text/plain; charset=utf-8"); 
     } 
    } 

实现上面的代码到系统仍然不执行一次部署在IIS中的线程。我真的很难解决这个问题,因为我不知道为什么线程在部署时没有执行。

+0

为什么不能呢?将所有必要的数据传递给该函数。此外,该任务不被“跳过”。确保您收到所有错误的通知。由于错误消失,“忘却遗忘”在生产中不可行。 – usr 2014-09-23 08:38:39

+0

所以上面的实现是一个难忘的?所有必要的数据都通过了。我不确定错误陷阱。我怎样才能确保代码通知系统所有的错误? – user3579974 2014-09-23 09:21:12

+0

未观察到任务的结果是在我的书中发生火灾并忘记了。确保UploadFunction具有try-catch-all并为每个错误发送邮件。链接的帖子是关于在请求线程中提取数据并将其传递给工作线程/任务。那篇文章对你的情况有什么意义?似乎你可以使用相同的方法。 – usr 2014-09-23 09:36:09

回答

0

有一个问题,当你试图模仿Windows标识:

WindowsIdentity newId = new WindowsIdentity(token); 
WindowsImpersonationContext impersonatedUser = newId.Impersonate(); 

var task2 =  Task.Factory.StartNew(() => { UploadFunction(); }, tokenSource.Token, TaskCreationOptions.LongRunning,TaskScheduler.Default); 

impersonatedUser.Undo(); 

的问题是,Impersonate功能只适用于该线程,和你的UploadFunction是在不同的线程运行。

这里有一个修改你的代码,有Impersonate方法称为后台任务的线程上:

WindowsIdentity newId = new WindowsIdentity(token); 
var task2 = Task.Factory.StartNew(() => 
           { 
            using(WindowsImpersonationContext wi = newId.Impersonate()) 
            { 
              UploadFunction(); 
            } 
           }, 
           tokenSource.Token, 
           TaskCreationOptions.LongRunning, 
           TaskScheduler.Default 
           ); 

我的猜测是,它的工作在本地机器上,因为你上传到允许匿名访问的文件夹。您的生产服务器上的权限将更加严格。

+0

嗨安德鲁,我试过你的代码,但它仍然无法在IIS上工作。有关如何在服务器中配置匿名访问的任何想法?谢谢。 – user3579974 2014-09-24 07:30:55

相关问题