5
我正在爲WCF Web服務編寫單元測試。我故意發送一個無效的請求到服務器拋出一個WebExceptionFault<string>
。在單元測試中,被捕獲的異常是EndpointNotFoundException
,InnerException
屬性中的標準WebException
。我想驗證響應的主體是否與我認爲應該在那裏的字符串匹配。內部異常的屬性是否被處理?
我來翻過一個問題,但是,作爲WebException
的Response
財產(這是一個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的屬性被設置?有沒有辦法解決?
這是可以預期的。 System.Net不會假定任何人發現異常將會經歷挖掘響應流並處理它的麻煩。所以在投擲之前它會清理乾淨。你不能改變這種行爲。 –
如果底層連接關閉,你肯定不應該能夠訪問響應流?此時,在開始處理'EndPointNotFoundException'異常時,您幾乎肯定會關閉它。我認爲你應該立即開始處理異常,因爲它會立即在響應流中讀取並將其封裝起來。 –
@Jeff:在上面的例子中底層連接何時關閉?我可以看到讀取響應流的最早點是在獲得'HttpWebResponse'後。那是你的意思嗎? – Clivest