Httpclient 处理Web Api.net核心和存储库模式时出错
我有一个关于web api和存储库的问题,这可能是一个重复的问题。 但是我试着去搜索,没有得到满意的答案。 在我的存储库中,我在httpclient的帮助下获取数据 我的问题是,我可以在我的响应中得到一个错误,或者我可以得到我可以映射到我的产品类的所需json数据 1) 若我得到一个错误,我怎样才能把它显示给控制器,并向用户显示一个错误。 2) 返回MessageResponse而不是IEnumerable,并在控制器内处理它 最好的方法是什么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
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代码的例子来更清楚地理解你的观点吗。