2011-06-25 19 views
5

我正在爲WCF Web服務編寫單元測試。我故意發送一個無效的請求到服務器拋出一個WebExceptionFault<string>。在單元測試中,被捕獲的異常是EndpointNotFoundExceptionInnerException屬性中的標準WebException。我想驗證響應的主體是否與我認爲應該在那裏的字符串匹配。內部異常的屬性是否被處理?

我來翻過一個問題,但是,作爲WebExceptionResponse財產(這是一個System.Net.SyncMemoryStream)設置,不能讀取。

我的代碼:

Clubs actual; 
try 
{ 
    //"201" is an invalid argument for the first parameter 
    actual = new Clubs(channel.GetClubs("201", "123")); 
} 
catch (EndpointNotFoundException e) 
{ 
    WebException w = e.InnerException as WebException; 
    Assert.IsNotNull(w); 

    HttpWebResponse resp = w.Response as HttpWebResponse; 
    Assert.IsNotNull(resp); 
    Assert.AreEqual(resp.StatusCode, HttpStatusCode.NotFound); 
    //Next line throws an ArgumentException saying Stream not readable 
    //Investigation shows it has been disposed 
    using (StreamReader sr = new StreamReader(resp.GetResponseStream())) 
     Assert.AreEqual(sr.ReadToEnd(), "League not allowed for selected club"); 
} 

這是正常的的InnerException的屬性被設置?有沒有辦法解決?

+8

這是可以預期的。 System.Net不會假定任何人發現異常將會經歷挖掘響應流並處理它的麻煩。所以在投擲之前它會清理乾淨。你不能改變這種行爲。 –

+0

如果底層連接關閉,你肯定不應該能夠訪問響應流?此時,在開始處理'EndPointNotFoundException'異常時,您幾乎肯定會關閉它。我認爲你應該立即開始處理異常,因爲它會立即在響應流中讀取並將其封裝起來。 –

+0

@Jeff:在上面的例子中底層連接何時關閉?我可以看到讀取響應流的最早點是在獲得'HttpWebResponse'後。那是你的意思嗎? – Clivest

回答