2013-04-25 54 views
1

我有一個MVC應用程序,它在本地運行良好,它在Azure網站上運行良好。但是,當部署爲雲服務時,訪問拒絕訪問某些xml文件的問題。Windows Azure雲服務 - 訪問已部署的xml文件被拒絕

這些XML文件只是應用程序所需的數據位,有助於確定應用程序中的某些設置。

在分層文件夾結構下有很多這樣的想法,因爲它們的每一個都經過處理以允許我在應用程序中繼承這些設置。 但是,無論如何,這在一天結束時基本上是不相關的,這些只是存儲在web根目錄下的文件夾中的xml文件。

將xml文件的生成操作屬性設置爲內容,以便它們可以通過發佈進行部署。事實上,我已將RDP加入雲服務虛擬機中,只是爲了檢查xml文件正在部署並可以確認它們。

但是,每當應用程序試圖讀取這些文件之一,我會得到以下訪問被拒絕的錯誤。

訪問路徑'E:\ sitesroot \ 0 \ Templates \ Applications \ ControlProperties.xml'被拒絕。

(注:這是不是假設由下面的答案硬編碼的路徑,我用我HttpContext.Current.Server.MapPath來確定相對該文件的物理路徑Web根)

這只是標準訪問被拒絕錯誤,表明應用程序無權讀取文件。

現在,如果我再次將RDP發送到機器並授予每個人對此特定文件的完全訪問權限(僅用於診斷目的!),那麼應用程序工作正常,不會引發錯誤。所以這證明它確實是一個訪問問題。

問題是,這些只是簡單的xml文件與項目部署,我真的不想在每個部署上設置文件權限。這只是錯誤的。

所以我想了解爲什麼作爲標準部署的一部分,雲服務無法訪問這些部署的XML文件,然後對合適的解決方案感興趣。即某些權限設置可能會隨解決方案一起部署,或者可能有更好的替代方法解決此問題。

就我用來讀取xml文件的代碼而言,我只是使用XmlSerializer將文件內容反序列化爲對象。 (如下)

public static T Deserialise(string settingsFile) 
    { 
     using (var fs = new FileStream(settingsFile, FileMode.Open)) 
     { 
      var sr = new XmlSerializer(typeof (T)); 
      var obj = (T) sr.Deserialize(fs); 
      fs.Close(); 
      return obj; 
     } 
    } 

據我所知,沒有用於Web角色的本地存儲,這將是罰款對我來說,如果我想能夠讀取和寫入存儲爲我的應用程序的一部分使用。但實質上這些是需要與應用程序一起部署的配置設置文件。

+0

如果他們的配置,你爲什麼不使用web.config文件? – mattytommo 2013-04-25 09:35:15

+0

因爲它們不適合在Web配置中存儲。因爲它們有一個嵌套的層次結構,最終可能會有數百個這樣的結果。加上德從web配置耦合它們可以讓我在未來更靈活,因爲我們可能開始更新應用程序本身這些文件,如果我們允許用戶修改這些模板設置。 – Kramer00 2013-04-25 10:42:56

回答

1

在端部的問題被證明是該文件存取方法。我最初使用文件流來打開文件的內容,甚至在提升的角色權限下運行時,我得到了這個訪問被拒絕的錯誤。

但是改變代碼首先讀取文件內容爲一個字符串,我能夠避免這種錯誤。

public static T Deserialise(string settingsFile) 
    { 
     var fileContents = File.ReadAllText(settingsFile); 
     using (var fs = new MemoryStream(Encoding.ASCII.GetBytes(fileContents))) 
     { 
      var sr = new XmlSerializer(typeof (T)); 
      var obj = (T) sr.Deserialize(fs); 
      fs.Close(); 
      return obj; 
     } 
    } 

不確定爲什麼Filestream方法需要這些額外的權限,但上面的解決方案在這種情況下適用於我。

0

項目本身您可以添加文件夾並將該文件路徑映射到web.config而不是E:\sitesroot\0\Templates\Applications\ControlProperties.xml。因此,只要您託管到Cloud Service,訪問權限問題就會自動避免。

我也喜歡做以下,

在網頁。配置:

<configuration> 
     <appSettings> 
      <add key="DocsPath" value="http://somesitename.cloudapp.net/Files/"/> 
     </appSettings> 
    <connectionStrings> 

代碼背後:

string Location = ConfigurationManager.AppSettings["DocsPath"] + "ChildFolderName" + "\\" + Filename.XML; 

在雲URL這不會給任何訪問權限錯誤。在這種web.config中,你也可以進行調試。只需要指出我在web.config中提到的上述路徑即可。在web.config中更改連接字符串和其他東西。

+0

嗨,訪問問題不是因爲路徑不存在。路徑/文件確實存在。我使用HttpContext.Current.Server.MapPath根據其相對於Web根目錄的位置來確定文件的物理路徑。 – Kramer00 2013-04-25 13:21:06

0

所不同的是在文件存取方法。 事實證明,你不能對書面Azure中的Web /輔助角色裏面打開的文件。即使您只是從文件File.Open中讀取以讀/寫訪問權限打開它們。 所以這應該工作太:

using (var stream = File.Open(settingsFile, FileMode.Open, FileAccess.Read)) 
{ 
... 
} 

我想這背後的全部原因是,在某些問題Azure的情況下自動使用最初上傳包重新部署自己的角色。在這種情況下,以前對這些文件所做的任何修改都會丟失,並被包中的原始文件替換。

相關問題