2014-09-23 86 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

相關問題