2013-11-22 63 views
1

失敗,此代碼在控制檯應用程序而不是MVC:的StreamReader在MVC

XmlSerializer s = new XmlSerializer(typeof(IDChckRspn)); 
StreamReader r = new StreamReader(@"d:\temp\response.xml"); 
object obj = s.Deserialize(r); 
IDChckRspn _response = (IDChckRspn)obj; 

在控制檯應用程序的調試,我可以深入到S,R,OBJ和_response。在MVC應用程序中,如果我試圖鑽入它們,它們將無法打開。有時它會在MVC中工作,但大部分時間不會。我懷疑它與加載文件有關,因爲如果我在對象obj上放置斷點,我仍然無法在MVC應用程序中鑽入r,但可以在控制檯應用程序中進行操作。在MVC應用程序中使用FileStream有類似的問題。

更新1 蘇萊曼的,現在我使用此代碼丹尼爾斯建議後:

IDChckRspn response; 
using (var r = new StreamReader(HttpContext.Server.MapPath("~/App_Data/response.xml"))) 
{ 
    response = new XmlSerializer(typeof(IDChckRspn)).Deserialize(r) as IDChckRspn; //'as' rather than a cast won't throw an exception 
} 

,但仍然得到同樣的結果,也不例外,不能鑽到本地窗口看響應。此代碼後的下一行是斷點。

更新2 我宣佈在包含此代碼var test = "";操作的變量。在那裏,我有問題(返回視圖中斷點;)。如果我評論清楚問題的聲明。如果我將斷點移動到response =行,並且即使在那裏使用變量聲明,它也可以工作。

public ActionResult VerifyID() 
{ 
    IDChckRspn response; 
    using (var r = new StreamReader(HttpContext.Server.MapPath("~/App_Data/response.xml"))) 
    { 
    response = new XmlSerializer(typeof(IDChckRspn)).Deserialize(r) as IDChckRspn; //'as' rather than a cast won't throw an exception 
    } 

    var test = ""; 
    return View(); 
} 

爲什麼在動作中聲明變量會導致.Deserializer失敗?

+0

任何錯誤信息?它是否會拋出任何異常?作爲MVC,我懷疑那個文件沒有INETUSR的權限。 – Gobo

+0

您是否附加到w3wp進程或從調試器啓動站點? –

+0

您應該發佈更多信息,例如異常! – Fals

回答

2

我懷疑這可能是因爲您沒有使用r.Close()關閉StreamReader,或者通過將它放入using子句中,甚至更好。

它有時候對你有用的事實使我得出這個結論。這可能是因爲您的虛擬主機進程持有開放式流式閱讀器並鎖定了文件。每次運行MVC應用程序時都不會得到新的進程 - 只有在您重新編譯時。

這不會與控制檯應用程序屁股你得到一個新的進程發生每次運行

XmlSerializer s = new XmlSerializer(typeof(IDChckRspn)); 
object obj; 
using (StreamReader r = new StreamReader(@"d:\temp\response.xml")) 
{ 
    obj = s.Deserialize(r); 
} //streamreader is closed here and access to the file is released 

IDChckRspn _response = (IDChckRspn)obj; 

不過要小心。當您使用MVC時,可以將您的StreamReader直接傳遞給您的ResponseStream,以將文件直接傳輸到瀏覽器中。它看起來並不像你在做什麼,而只是意識到: - 在這種情況下,你不想關閉StreamReader並且你不想使用using子句。當你這樣做時,流會在發送響應之前關閉,並且出現錯誤。相反,當ASP.NET調用ResponseStream上的Dispose方法時,StreamReader會自動關閉。

順便說一句,下面是你的代碼更安全的版本...

IDChckRspn response; 
using (var r = new StreamReader(@"d:\temp\response.xml")) 
{ 
    response = new XmlSerializer(typeof(IDChckRspn)).Deserialize(r) 
     as IDChckRspn; //'as' rather than a cast won't throw an exception 
} 
if (response == null) 
{ 
    //Log or throw new Exception("Couldn't convert'd:\temp\response.xml' to IDChckRspn"); 
} 
//else... success...use response 
+0

這聽起來很不錯,但不幸的是沒有清楚這個問題。我逐字複製和粘貼您的代碼並得到相同的結果。重新啓動VS以獲得更好的效果,但仍然失敗:(。 – Joe

+0

)您是否看到有關引發異常的註釋?是否有? –

+0

再次提供了很好的建議,但結果仍然相同,沒有例外,無法深入本地窗口。也加入了Sleiman的HttpContext.Server.MapPath(「〜/ App_Data/response.xml」)),並再次得到同樣的失敗。 – Joe

2

我覺得現在的問題是,你不應該訪問本地文件的Web應用程序,而不是你可以把你App_Data文件夾中的文件

using (var reader = new StreamReader(HttpContext.Server.MapPath("~/App_Data/response.xml"))) 
{ 
// make sure you use using statement, it closes the file for you 
} 
+0

很好的建議,但不會清除錯誤。即使我把你的代碼編入丹尼爾的第二版代碼。 – Joe