我無法從HttpRequestExceptioncatch 塊的 netstandard 2.1 上獲取狀態代碼。在 .NET Framework 中有一個額外的屬性“StatusCode”,但我找不到任何與 netstandard 類似的屬性。有沒有其他選擇?
提前致謝。
我已經嘗試將 aHttpRequestException轉換為WebException. 捕獲 aWebException不會觸發捕獲。
uj5u.com熱心網友回復:
正如在對您的 OP 的評論中已經提到的,該StatusCode屬性是在 .NET 5 中引入的,在 .NetStandard 中將不可用。這意味著你必須“自己做”。
您可以在現有例外中包含狀態代碼值,而無需通過Data像這樣利用字典來創建和維護新的例外型別(根據自己的喜好更改名稱):
public static class HttpResponseMessageExtensions
{
public static void MyEnsureSuccessStatusCode(this HttpResponseMessage httpResponseMessage)
{
try
{
httpResponseMessage.EnsureSuccessStatusCode();
}
catch (HttpRequestException ex) when (ex.SetStatusCode(httpResponseMessage.StatusCode))
{
// Intentionally left empty. Will never be reached.
}
}
}
public static class HttpRequestExceptionExtensions
{
private const string StatusCodeKeyName = "StatusCode";
public static bool SetStatusCode(this HttpRequestException httpRequestException, HttpStatusCode httpStatusCode)
{
httpRequestException.Data[StatusCodeKeyName] = httpStatusCode;
return false;
}
public static HttpStatusCode? GetStatusCode(this HttpRequestException httpRequestException)
{
return (HttpStatusCode?)httpRequestException.Data[StatusCodeKeyName];
}
}
請注意那里使用了始終為假的例外過濾器。這確保了修改原始例外不會產生嚴重的成本,因為它保留了原始例外(它永遠不會在那里“捕獲”)
然后,您可以使用新擴展而不是原始擴展EnsureSuccessStatusCode來引發例外:
// grab real response here
var response = default(HttpResponseMessage);
response.MyEnsureSuccessStatusCode();
GetStatusCode您可以使用在上游捕獲例外的任何人的擴展從例外物件中獲取狀態代碼。
如果您想讓它更加健壯,并確保您只呼叫GetStatusCode使用自定義多載引發的例外,您還可以在字典中添加一個“標記”值以指示它是使用擴展引發的并采取行動對此(例如,拋出一個InvalidOperationException說法,該方法只能與 結合使用MyEnsureSuccessStatusCode)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/527951.html
標籤:C#网。网asp.net 核心.net 标准
上一篇:如何在“FOR”回圈中“迭代”?
