2012-01-24 69 views
2

我在Windows 2008 R2(.NET Framework 4.0,IIS 7.5)上有一個ASP.NET應用程序,我想運行控制檯應用程序當我點擊一個網頁上的按鈕。下面是代碼:從ASP.NET應用程序(IIS 7,5)運行控制檯應用程序(.exe)

protected void btnUpdate_Click(object sender, EventArgs e) 
    { 
     string fileLocation = @"D:\DTDocs\App_Code\LoadDTDocsXML.exe"; 
     ProcessStartInfo oStartInfo = new ProcessStartInfo(); 
     oStartInfo.FileName = fileLocation; 
     oStartInfo.UseShellExecute = false; 
     Process.Start(oStartInfo); 
} 

當我運行從Visual Studio 2010中(其內部IIS)ASP.NET應用程序,控制檯應用程序運行好。但是,當我在VS 2010之外運行ASP.NET應用程序時,我沒有發生錯誤,但控制檯應用程序沒有完成他的工作(它必須在磁盤上創建一個xml文件)。 我認爲問題是IIS 7.5的配置,我不知道確切的我必須給我的控制檯應用程序涉及的文件夾的訪問權限。 在IIS 7.5中,我設置了Physical Path Credential for 特定用戶 =我的Windows帳戶,但這並不能解決問題。 謝謝。

+0

你怎麼知道它不運行? – Basic

回答

1

ASP.NET Dev Server在當前用戶的憑據下運行(就是你)。 IIS 7.5在應用程序池設置中指定的用戶下運行ASP.NET應用程序 - 通常爲ApplicationPoolIdentity(在配置文件權限時,可以將其引用爲用戶「IIS AppPool \ [ApplicationPoolName]」)。您也可以將其更改爲「網絡服務」(IIS 7.0中的默認值)。

請檢查爲您的應用程序池配置了哪種身份,併爲此用戶提供必要的權限。

+0

爲我的應用程序池配置的身份設置爲自定義用戶(=我的Windows帳戶,這是管理員在服務器上,我給他明確權限的文件夾)。我已經嘗試用戶「IIS APPPOOL \ DefaultAppPool」,但沒有任何更改。但是我不知道爲我的應用程序扮演物理路徑憑據的角色(現在設置爲與應用程序池中的相同的帳戶)。 –

1

我看到的第一個問題是安全性/文件訪問。當從VS內部運行時,服務器和客戶機在您的憑據下是同一臺機器。當在測試/生產環境中運行時,服務器和客戶端在物理上是不同的機器,IIS將以受限制的權限運行該網站。因此IIS有很大可能無法訪問D:處的文件...因爲安全性。

下一個問題是從網站運行一個控制檯應用程序。控制檯是另一種形式的UI,就像HTML和WPF一樣。我個人不會從網絡執行控制檯(除非沒有其他選擇)。我會將API集成到Web應用程序中。 2個用戶界面共享相同的邏輯。

+0

我爲我的web應用程序使用表單身份驗證,並將物理路徑憑據(在IIS中)設置爲特定用戶(我的Windows帳戶是服務器上的管理員)。令我感到困惑的是,在VS中一切正常,而且我沒有成功設置IIS 7.5,因此應用程序可以成功啓動控制檯應用程序。 我想避免重寫Web應用程序中的控制檯應用程序,因爲(至少對我而言)並不那麼簡單,那就是爲什麼我試圖通過這種方式來解決問題。 –

+0

將「控制檯」邏輯封裝到API中,然後在我們和控制檯中引用API。保持代碼乾爽。 –

+0

非常感謝,我遵循您的建議,非常方便。 –

2

只是添加到其他2個答案 - 你真的需要從您的網絡服務器運行一個exe文件嗎?

我必須這樣做,它幾乎總是最後的選擇 - 它大大削弱了您的安全性(現在,所有人都必須在您的系統上運行可執行文件是在代碼中發現一個缺陷),並有一系列其他問題(網絡服務器沒有「登錄」到服務器,所以它沒有桌面,模擬是一個真正的痛苦在一個$ $$才能正常工作(假設你是要運行具有不同權限的可執行文件到web服務器)等

如果有任何其他的方式來實現自己的目標,它幾乎肯定會更簡單。

我們去的一個選項是有一個帶有WCF en的新應用程序d點的網絡服務器可以溝通。所以,當有人按下按鈕時,WS調用我們的應用程序通過WCF,並告訴它運行各種命令。這樣,你得到了:

  • 網絡和控制檯代碼之間的清晰分離。
  • 一個狡猾的控制檯應用程序將無法取下來的web服務器&反之亦然
  • 如果控制檯應用程序是長時間運行,這使您可以錯開您的網站/控制檯應用程序的版本,這樣你不殺應用程序執行中,只是因爲你需要升級一些CSS併發布。
  • 巨大的安全優勢 - Web服務器即使遭到入侵也無法運行可執行文件。
  • WCF應用程序將能夠仔細檢查請求,以確定它們在執行前是否有效。

請注意,無論你如何做,只要有人惡意發現了正在發生的事情並啓動流程,他們幾乎可以毫不費力地做出決定 - 確保將此方法鎖定爲TIGHT。

編輯:讀過上面的評論,我認爲你正在碰到「桌面」問題。從服務器啓動可執行文件時,登錄用戶永遠無法看到應用程序,因爲登錄用戶的桌面無法從IIS訪問,反之亦然。這與在Windows服務上使用GUI非常相似。

This也可能是感興趣的。

+0

盯着我的是,當我使用VS運行Web應用程序時,控制檯應用程序運行,而不是當我離開VS時,使用IIS。感謝您的回答,我很欣賞您的觀點。 –

+0

IIS很可能正在運行應用程序 - 您無法看到它。該應用做什麼?嘗試自己創建一個簡單的應用程序,只需將它寫入公共文本文件 – Basic

+0

控制檯應用程序創建包含文件夾結構和內容的虛擬目錄的un xml文件。所以我可以看到控制檯應用程序是否正在運行。我會嘗試您的建議來創建一個簡單的應用程序。非常感謝。 –

相關問題