Httpclient 处理Web Api.net核心和存储库模式时出错

Httpclient 处理Web Api.net核心和存储库模式时出错,httpclient,asp.net-core-webapi,repository-pattern,Httpclient,Asp.net Core Webapi,Repository Pattern,我有一个关于web api和存储库的问题,这可能是一个重复的问题。 但是我试着去搜索,没有得到满意的答案。 在我的存储库中,我在httpclient的帮助下获取数据 我的问题是,我可以在我的响应中得到一个错误,或者我可以得到我可以映射到我的产品类的所需json数据 1) 若我得到一个错误,我怎样才能把它显示给控制器,并向用户显示一个错误。 2) 返回MessageResponse而不是IEnumerable,并在控制器内处理它 最好的方法是什么 enter code here public in

我有一个关于web api和存储库的问题,这可能是一个重复的问题。 但是我试着去搜索,没有得到满意的答案。 在我的存储库中,我在httpclient的帮助下获取数据

我的问题是,我可以在我的响应中得到一个错误,或者我可以得到我可以映射到我的产品类的所需json数据

1) 若我得到一个错误,我怎样才能把它显示给控制器,并向用户显示一个错误。 2) 返回MessageResponse而不是IEnumerable,并在控制器内处理它

最好的方法是什么

enter code here
public interface IProduct{
    Task<IEnumerable<Product>> All();
} 

public class Product:IProduct
{
      public async Task<IEnumerable<Product>> All(){
          var ResponseMessage=//some response.
       }
}
在此处输入代码
公共接口IPProduct{
任务全部();
} 
公共类产品:IPProduct
{
公共异步任务All(){
var ResponseMessage=//一些响应。
}
}

您可以自定义一个用于获取响应错误消息的
ApiException
,并在startup.cs中调用
UseExceptionHandler
,请参阅以下内容:

ProductRep

 public class ProductRep : IProduct
{
    private readonly HttpClient _client;
    public ProductRep(HttpClient client)
    {
        _client = client;
    }
    public async Task<IEnumerable<Product>> All()
    {
        List<Product> productlist = new  List<Product>();

        var response = await _client.GetAsync("https://localhost:44357/api/values/GetProducts");

        string apiResponse = await response.Content.ReadAsStringAsync();

        if (response.IsSuccessStatusCode == false)
        {
            JObject message = JObject.Parse(apiResponse);
            var value = message.GetValue("error").ToString(); 
            throw new ApiException(value);                
        }

        productlist = JsonConvert.DeserializeObject<List<Product>>(apiResponse);

        return productlist;
    }

    public class ApiException : Exception
    {
        public ApiException(string message): base(message)
        { }
    }
}
公共类ProductRep:IPProduct
{
私有只读HttpClient\u客户端;
公共产品代表(HttpClient客户端)
{
_客户=客户;
}
公共异步任务All()
{
List productlist=新列表();
var response=wait_client.GetAsync(“https://localhost:44357/api/values/GetProducts");
字符串apiResponse=wait response.Content.ReadAsStringAsync();
if(response.issusccessstatuscode==false)
{
JObject message=JObject.Parse(apiResponse);
var value=message.GetValue(“错误”).ToString();
抛出新的ApiException(值);
}
productlist=JsonConvert.DeserializeObject(apiResponse);
返回产品列表;
}
公共类异常:异常
{
公共ApiException(字符串消息):基本(消息)
{ }
}
}
Startup.cs

app.UseExceptionHandler(a => a.Run(async context =>
            {
                var feature = context.Features.Get<IExceptionHandlerPathFeature>();
                var exception = feature.Error;

                var result = JsonConvert.SerializeObject(new { error = exception.Message });
                context.Response.ContentType = "application/json";
                await context.Response.WriteAsync(result);
            }));
app.UseExceptionHandler(a=>a.Run(异步上下文=>
{
var feature=context.Features.Get();
var异常=特征。错误;
var result=JsonConvert.SerializeObject(新的{error=exception.Message});
context.Response.ContentType=“应用程序/json”;
wait context.Response.WriteAsync(结果);
}));

将错误处理程序添加到请求之前执行的管道中,该处理程序只是一个将执行代码包装在try catch中的类,然后只需处理每个错误并清除不希望发送到user@johnny5,谢谢你的提示,非常感谢,你能给我一个c代码的例子来更清楚地理解你的观点吗。