Error handling RestSharp GetAsync忽略响应错误状态代码

Error handling RestSharp GetAsync忽略响应错误状态代码,error-handling,restsharp,http-status-codes,Error Handling,Restsharp,Http Status Codes,关于RestSharp的GetAsync方法的评论明确提到: 使用GET HTTP方法执行请求。如果请求未成功,将引发异常 我不知道该怎么解释。我希望它在返回未成功HTTP状态代码时抛出异常。情况似乎并非如此。当返回404或500状态时,该方法愉快地尝试反序列化响应。只有当响应主体包含无效的json(或xml,或任何“已接受”的内容)时,才会抛出错误 我错过什么了吗?我应该如何使用这些异步方法处理这样的错误响应?这种行为也让我很反感 查看的源代码,GetAsync方法实现为: public st

关于RestSharp的
GetAsync
方法的评论明确提到:

使用GET HTTP方法执行请求。如果请求未成功,将引发异常

我不知道该怎么解释。我希望它在返回未成功HTTP状态代码时抛出异常。情况似乎并非如此。当返回404或500状态时,该方法愉快地尝试反序列化响应。只有当响应主体包含无效的json(或xml,或任何“已接受”的内容)时,才会抛出错误


我错过什么了吗?我应该如何使用这些异步方法处理这样的错误响应?

这种行为也让我很反感

查看的源代码,
GetAsync
方法实现为:

public static async Task<T> GetAsync<T>(this IRestClient client, IRestRequest request, CancellationToken cancellationToken = default)
{
    var response = await client.ExecuteGetAsync<T>(request, cancellationToken);
    ThrowIfError(response);
    return response.Data;
}
关于你的问题:

我应该如何使用这些异步方法处理此类错误响应

你不能:(

我相信您必须实现自己的
Get
异步实现

下面是我所做工作的一个例子:

private Task<T> GetAsync<T>(RestRequest request)
{
    return Task.Run(() =>
    {
        var response = client.Get<T>(request);
        if (response.IsSuccessful)
            return response.Data;

        //handle the errors as you wish. In my case, the api I work with always
        //returns a bad request with a message property when it occurs...
        var errorData = JsonConvert.DeserializeObject<ApiMessage>(response.Content);
        throw new Exception(errorData.Message);
    });
}

public class ApiMessage
{
    public string Message { get; set; }
}
private Task GetAsync(RestRequest请求)
{
返回任务。运行(()=>
{
var response=client.Get(请求);
if(response.issucessful)
返回响应数据;
//按照您的意愿处理错误。在我的情况下,我使用的api总是
//发生错误请求时,返回带有消息属性的错误请求。。。
var errorData=JsonConvert.DeserializeObject(response.Content);
抛出新异常(errorData.Message);
});
}
公共类消息
{
公共字符串消息{get;set;}
}
用法:

public Task<MyModel> SomeRequest()
{
    var request = new RestRequest()
    {
        Resource = "some-resource",
    };

    return GetAsync<MyModel>(request);
}
公共任务SomeRequest()
{
var request=new RestRequest()
{
Resource=“some Resource”,
};
返回GetAsync(请求);
}
来源:

作为一个应该如何做的示例,以及我期望它如何工作,请看一下Flurl HttpClient是如何做的:
public Task<MyModel> SomeRequest()
{
    var request = new RestRequest()
    {
        Resource = "some-resource",
    };

    return GetAsync<MyModel>(request);
}