c# - 如何处理 flurl 中的错误请求异常

标签 c# visual-studio controller flurl

我是 Flurl 的新手。我正在尝试调用 api,我故意在参数中传递了无效的 apikey,然后 api 失败并显示“禁止”并显示错误代码 403。我如何在异常中处理它?<​​/p>

 public async Task<myResponse> MyService(myRequest request)
    {
        try
        {


            return await new Flurl.Url("https://myapi.com/rest/age?apikey=XXXXXXXX").PostJsonAsync(apirequest).ReceiveJson<myResponse>();
        }
        catch (FlurlHttpException ex)
        {
            var statusCode = await ex.GetResponseJsonAsync<myResponse>();
            return await ex.GetResponseJsonAsync<myResponse>();

        }

如果我得到状态代码 403,我想抛出我自己的自定义异常,但目前它在 var statusCode = await ex.GetResponseJsonAsync<myResponse>(); 行失败

最佳答案

I want to throw my own custom exception if i get status code 403

有两种方法可以做到这一点。第一种是简单地从 catch block 中重新抛出( catch/when 在这里很方便):

try
{
    ...
}
catch (FlurlHttpException ex) when (ex.Call.HttpStatus == HttpStatusCode.Forbidden)
{
    throw new MyException(...);
}

第二种方法是使用 AllowHttpStatus 来防止 Flurl 抛出异常。 :

var resp = await "https://myapi.com/rest/age?apikey=XXXXXXXX"
    .AllowHttpStatus("4xx")
    .PostJsonAsync(apirequest);

if (resp.StatusCode == HttpStatusCode.Forbidden)
{
    throw new MyException(...);
}

第二种方法的一个警告是,您将得到一个“原始” HttpResponseMessage 。你需要自己反序列化,因为 Flurl 的 ReceiveJson链子 Task<HttpResponseMessage> , 你已经在等待 Task .但是自己反序列化is not that hard , 有一个 planned enhancement这将在不久的将来解决这个问题,或者您可以随时使用这个 hacky 的小解决方法:

await Task.FromResult(resp).ReceiveJson<myResponse>();

老实说,我可能会选择第一种方法。 FlurlHttpException有一些方便的方法,如 GetResponseJsonAsync<T>如果错误主体是 JSON 或 GetResponseStringAsync,它允许您反序列化错误主体如果您只需要原始字符串。

关于c# - 如何处理 flurl 中的错误请求异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55020852/

相关文章:

c# - 编译器指令重新排序的隐式限制?

c - AVL 树删除导致程序崩溃

vb.net - VS2015 RC 延迟通知

controller - 如何从 Controller 中的 header 获取 JWT token

javascript - $scope.model 属性的配置未定义

c# - wmi 无效查询错误

C# - 内部成员的命名约定

c# - 如何将正确的具体类注入(inject)到封闭系统中

c# - Visual Studio 运行 .NET 应用程序中的调试日志文件位置

c# - 如何使用 MVC 动态构建多个站点