Ошибка перехвата при возникновении в ОК метод OData - PullRequest
1 голос
/ 05 августа 2020

У меня есть пример использования: при получении свойства в модели произойдет ошибка:

public class Student
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public int Score { get; set; }

    public Student ErrorProperty { get { throw new Exception(); } set { } }
}

Я пытаюсь расширить ErrorProperty: https://localhost: 44383 / odata / Student? $ Expand = ErrorProperty В контроллере похоже, что все в порядке, он не генерирует никаких исключений:

 [HttpGet]
    [EnableQuery()]
    public IActionResult Get(ODataQueryOptions<TEntity> queryOptions, CancellationToken cancellationToken)
    {
        var list = new List<Student>
        {
            CreateNewStudent("Cody Allen", 130),
            CreateNewStudent("Todd Ostermeier", 160),
            CreateNewStudent("Viral Pandya", 140)
        };
        return Ok(list);
    }

После выполнения этого метода (метод Get) модель выдает исключение. В Postman я получаю Could not get response ошибку: ошибка

Также я создал обработчик ошибок, но он не улавливает такого рода исключения:

 public class ODataExceptionHandler
{
    public static RequestDelegate HandleException()
    {
        return async context =>
        {
            await Handle(context);
        };
    }

    public static Task Handle(HttpContext context)
    {
        return Task.Run(new Action(() =>
        {
            context.Response.ContentType = "application/problem+json";
            var exceptionHandlerPathFeature = context.Features.Get<IExceptionHandlerPathFeature>();
            var content = JsonConvert.SerializeObject(exceptionHandlerPathFeature);
            byte[] byteArray = Encoding.ASCII.GetBytes(content);
            context.Response.Body.Write(byteArray);
        }));
    }
}

Конфигурация:

  app.UseExceptionHandler(errorApp =>
        {
            errorApp.Run(ODataExceptionHandler.HandleException());
        });

Как я могу ловить такого рода ошибки?

1 Ответ

1 голос
/ 10 августа 2020
public class Patient
{
    public ulong PatientId { get; set; }
    public string Name { get; set; }
    public string City { get; set; }
    public DateTime PurchaseDateTime { get; set; }
    public ICollection<PatientForms> PatientForms { get; set; }


    public Patient ErrorProperty { get { throw new Exception(); } set { } }

}

ОБНОВЛЕНИЕ 8.10.2020

Добавление ExceptionHandler

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        //if (env.IsDevelopment())
        //{
        //    app.UseDeveloperExceptionPage();
        //}
        //else
        //{
            //app.UseExceptionHandler("/Home/Error");

            app.UseExceptionHandler(errorApp =>
            {
                errorApp.Run(ODataExceptionHandler.HandleException());
            });

            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        //}
        app.UseHttpsRedirection();


        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "odata/{controller=Home}/{action=Index}/{id?}");
            endpoints.EnableDependencyInjection();
            endpoints.Select().Expand().Filter().OrderBy().Count().MaxTop(10);

        });


    }

Скриншот теста

введите описание изображения здесь





Шаги использования OData

Запуск .cs

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews().AddNewtonsoftJson();
        services.AddOData();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        ...

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "odata/{controller=Home}/{action=Index}/{id?}");
            endpoints.EnableDependencyInjection();
            endpoints.Select().Expand().Filter().OrderBy().Count().MaxTop(10);

        });
    }

Контроллер .cs

[ODataRoutePrefix("Student")]
public class StudentsController : ODataController
{
    ...

    [ODataRoute]
    [EnableQuery]
    public IActionResult Get()
    {
        var list = new List<Student>
        {
            CreateNewStudent("Cody Allen", 130),
            CreateNewStudent("Todd Ostermeier", 160),
            CreateNewStudent("Viral Pandya", 140)
        };
        return Ok(list);
    }
}
...