2014-09-04 128 views
0

我有一個MVC應用程序,並試圖訪問我在IIS中設置的本地主機ftp服務器 - 最終它將訪問其他ftp服務器,但我只想在本地嘗試。我使用FtpWebRequest編寫了一個c#函數,但是當我調用GetResponse()時,它會返回錯誤:「遠程服務器返回錯誤:(530)Not logged in。」不確定如何以匿名或非匿名用戶身份登錄。如果我在IIS中有一個名爲「MyFTPSite」的FTP站點並啓用了匿名身份驗證,那麼URL字符串的格式是否正確?網絡創新應該是什麼? Files目錄是ftproot的子項 - 我需要爲Files文件夾添加一個虛擬目錄嗎?現在,ftp站點的物理路徑被設置爲C:\ inetpub \ ftproot。 (在下面的代碼中,localhost故意拼寫錯誤的b/c該網站不希望我使用本地主機url)。通過.Net訪問本地主機FTP服務器

public override bool DownloadFile() 
    { 
     string fileName = System.IO.Path.GetFileName(this.UrlString); 

     FtpWebRequest request = (FtpWebRequest)WebRequest.Create(this.UrlString); 
     request.Method = WebRequestMethods.Ftp.DownloadFile; 

     //anonymous logon 
     request.Credentials = new NetworkCredential("anonymous", "<my email>"); 

     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

     response.Close(); 
     return true; 

    } 

FTPDownload download = new FTPDownload(@"ftp://lclhost/MyFTPSite/Files/w4.pdf"); 
download.DownloadFile(); 

回答

0

您的代碼看起來可能是罰款—更可能的,你可以通過修改IIS FTP服務器的設置解決這個問題。

首先,一些想法,以獲得一個基地已知的配置。

  1. 打開IIS管理器工具。
  2. 讓我們確保您仍然有IUSR作爲IIS在其內部安全方案中使用匿名身份驗證的用戶。點擊左側邊欄的頂部節點(應該是您的計算機名稱),然後點擊主內容區域中IIS部分的Authentication。確保已啓用Anonymous Authentication。點擊此項目,然後點擊右側邊欄中的Edit。確保它已被設置爲Specific User,值爲IUSR。只要是這種情況,我們不需要處理IUSR密碼等。
  3. 點擊左側邊欄中的FTP站點。
  4. 在右側邊欄中,點擊Basic Settings。記下網站指向的目錄 - 例如。 C:\inetpub\ftproot,並確保這與您的代碼試圖下載的測試文件的預期位置相匹配。
  5. 在右側邊欄中點擊Bindings。由於您的代碼沒有提及特定的端口,請確保在此設置端口21。至於IP Address,將其設置爲All Unassigned應該沒問題,或者你可以設置爲'127.0.0.1'。
  6. 在主窗口區域,我們來看看設置。
    • FTP AuthenticationAnonymous Authentication應設置爲EnabledBasic Authentication應設置爲Disabled提示:使用<alt> + <left>鍵盤快捷鍵返回主模塊列表
    • FTP Authorization:按如下所示添加Allow Rule:選擇Specified Users,並設置爲IUSR。授予Read權限。
    • :如果您看到任何配置的規則,請將其移除。在右側邊欄點擊Edit Feature Settings,然後確保它在Access for Unspecified Clients下設置爲Allow。您可以不選中Enable Domain Retrictions
    • FTP SSL Settings:檢查Allow SSL Connections。 (啓用Require SSL connections不是你想要的。)
  7. 好的,現在在左側邊欄中,右鍵單擊您的FTP站點並選擇Edit Permissions,這將彈出打開屬性窗口。轉至Security選項卡,然後根據需要進行一些ACL更改。最重要的是,IUSR帳戶至少需要以下內容:Read & Execute,List folder contents,Read。這會讓你的代碼匿名下載文件。您可能需要爲上傳功能添加ModifyWrite。要進行更改,您可能需要禁用從父目錄—繼承,如果是這樣,我建議複製現有的權限,而不是從空白的石板開始。如果您在此處進行了任何更改,則可能需要使用Replace all child object permissions...選項,以確保從根目錄下的所有內容現在都具有相同的訪問控制條目。
  8. 打開一個管理員命令提示符,然後鍵入iisreset

好了,現在IIS已經配置,讓我們來看看代碼。將稱爲test.txt一個小的文本文件中的FTP站點的根目錄後,我得到了下面的代碼,改編自您的樣品,以我的本地機器上運行:

string ftpHost = "ftp://localhost/test.txt"; 

FtpWebRequest request = (FtpWebRequest) WebRequest.Create(ftpHost); 
request.Method = WebRequestMethods.Ftp.DownloadFile; 

//anonymous logon 
request.Credentials = new NetworkCredential("anonymous", "[email protected]"); 

FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

Stream responseStream = response.GetResponseStream(); 
StreamReader reader = new StreamReader(responseStream); 
Console.WriteLine(reader.ReadToEnd()); 

Console.WriteLine("Download Complete, status {0}", response.StatusDescription); 

reader.Close(); 
response.Close(); 

Console.ReadLine(); 

[免責聲明:這些說明配置一個在開發機器上工作的本地FTP服務器,允許.NET FtpClient類以匿名方式連接到它。不要考慮在生產環境中使用這些好的指令。]

+0

不會ftpHost必須包含我給FTP站點的名稱,比如ftp://localhost/MyFTPSite/test.txt?通過你的步驟,仍然有相同的錯誤。我做了第7步中的事情,但還沒有爲IUSR做過。 – Kelly 2014-09-05 16:37:38

+0

嗨凱利,這是正確的 - 在我的例子中,我在默認的IIS FTP根目錄上運行一個FTP站點,所以不需要子目錄('ftp:// localhost'直接映射到文件目錄)。關鍵是你需要站點/文件的完整路徑是正確的。一種快速測試路徑和不安裝的方法:打開FireFox或Chrome,然後嘗試瀏覽到您的FTP根目錄。如果它允許你進入,那麼你知道路徑是正確的,並且anon安全性已正確打開。在您的代碼中,嘗試在您的網絡瀏覽器中驗證確切路徑後進行硬編碼。在調試器中逐步完成,並報告您看到的任何前端。 – 2014-09-05 17:08:18

+0

此外,這是代碼中的一個不同於我們正在討論的範圍,但由於代碼示例中的倒數第二行有一個指定** lclhost **(而不是「localhost」)的文字路徑,所以上面的hard在創建'FtpWebRequest'時編碼一個已知工作路徑(在瀏覽器中驗證)將消除路徑的變量成爲問題。 – 2014-09-05 19:36:15

相關問題