Ошибка при обработке ядра Web Api .net и шаблона репозитория - PullRequest
0 голосов
/ 26 октября 2019

У меня есть вопрос о веб-API, и репозиторий может быть дубликатом вопроса. но я попытался найти его и не получил удовлетворительного ответа. В моем репозитории я получаю данные с помощью httpclient.

Мой вопрос заключается в том, что я могу получить ошибку в своем ответе или получить необходимые данные json, которые я могу сопоставить с классом моего продукта. Я возвращаю IEnumerable.

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.
       }
}

1 Ответ

0 голосов
/ 28 октября 2019

Вы можете настроить ApiException, который используется для получения сообщения об ошибке ответа, и вызвать UseExceptionHandler в файле startup.cs, см. Следующее:

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)
        { }
    }
}

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);
            }));
...