Jaki jest wzorzec użytkowania HttpResponseMessage.EnsureSuccessStatusCode()
? Pozbywa się treści wiadomości i wyrzuca HttpRequestException
, ale nie widzę, jak programowo obsłużyć ją inaczej niż rodzajowy Exception
. Na przykład nie zawiera HttpStatusCode
, co byłoby przydatne.
Czy jest jakiś sposób, aby uzyskać więcej informacji? Czy ktoś mógłby pokazać odpowiedni wzorzec użycia obu EnsureSuccessStatusCode()
i HttpRequestException?
źródło
(int)response.StatusCode
(patrz msdn.microsoft.com/en-us/library/… )Nie podoba mi się RememberSuccessStatusCode, ponieważ nie zwraca nic sensownego. Dlatego stworzyłem własne rozszerzenie:
kod źródłowy dla programu GuaranteeSuccessStatusCode firmy Microsoft można znaleźć tutaj
Wersja synchroniczna oparta na łączu SO :
To, co mi się nie podoba w IsSuccessStatusCode, to fakt, że nie można go „ładnie” ponownie wykorzystać. Na przykład możesz użyć biblioteki takiej jak Polly, aby powtórzyć żądanie w przypadku problemu z siecią. W takim przypadku potrzebujesz kodu do zgłaszania wyjątku, aby Polly lub inna biblioteka mogła go obsłużyć ...
źródło
EnsureSuccessStatusCode
. Zawsze usuwaszresponse.Content
(ponieważ w końcu jest wywoływany zawsze nawet poreturn;
oświadczeniu) i niszczy treść do dalszego czytania. Oryginalna implementacja usuwa zawartość tylko wtedy, gdy kod stanu nie wskazuje pomyślnego wyniku.await response.Content.ReadAsStringAsync()
sprawdzaszif (response.Content != null)
HttpRequest
połączeń i skonfigurować zasady zarówno do obsługi określonych wyjątków, jak i niektórychHttpResponseCode
. Zobacz przykład w pliku Readme Polly tutajresponse.Content
być null, skoro właśnie wywołano metodę?Używam CompareSuccessStatusCode, gdy nie chcę obsługiwać wyjątku w tej samej metodzie.
Wyjątek zgłoszony w GetUserIdAsync będzie obsługiwany w DoSomethingAsync.
źródło
Poniżej przedstawiam proponowane przeze mnie rozwiązanie. Jedyną wadą jest to, że ponieważ menedżer zasobów platformy ASP.NET Core jest wewnętrzny dla platformy, nie mogę bezpośrednio ponownie używać umiędzynarodowionych ciągów komunikatów firmy Microsoft, więc używam tutaj po prostu dosłownego angielskiego literału wiadomości.
Plusy
ConfigureTestContainer<T>
Cons
response.EnsureSuccessStatusCode();
i pozwól serwerowi się tym zająć.Content
nieruchomością przed sprawdzeniem statusu. Mogą zaistnieć sytuacje, w których nie jest to pożądane, a jedną z nich jest nieefektywność.Stosowanie
API
źródło