Есть ли способ справиться с ошибками odata ядра asp.net?
У меня есть класс модели DimDateAvailable
с одним свойством, первичным ключом int DateId
, и я делаю вызов типа /data/DimDateAvailable?$select=test
.
Другие вызовы работают должным образом и возвращают то, что мне нужно - это преднамеренный вызов для генерации ошибки, и он терпит неудачу, потому что в модели нет свойства с именем test. Ответ возвращается, как ожидалось, например: {"error":{"code":"","message":"The query specified in the URI is not valid. Could not find a property named 'test' on type 'DimDateAvailable'...
, за которым следует трассировка стека.
Этот ответ хорош, когда env.IsDevelopment()
равно true
, но я не хочу показывать трассировку стека, когда он не находится в разработке.
Я посмотрел, как заключить код в метод get
контроллеров в try-catch, но я думаю, что есть фильтр действий, работающий над результатами, поэтому он никогда не вызывается. С другой стороны, я не вижу, куда внедрять какое-либо промежуточное ПО и / или добавлять какие-либо фильтры для обнаружения ошибок. Я подозреваю, что есть способ переопределить средство форматирования вывода для достижения того, чего я хочу, но я не понимаю, как это сделать.
Вот что у меня есть на данный момент:
В Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<TelemetryDbContext>();
services.AddOData();
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc(routeBuilder =>
{
routeBuilder.MapODataServiceRoute("odata", "data", GetEdmModel());
routeBuilder.Select().Expand().Filter().OrderBy().MaxTop(null).Count();
// insert special bits for e.g. custom MLE here
routeBuilder.EnableDependencyInjection();
});
}
private static IEdmModel GetEdmModel()
{
var builder = new ODataConventionModelBuilder();
builder.EntitySet<DimDateAvailable>("DimDateAvailable");
return builder.GetEdmModel();
}
В TelemetryDbContext.cs:
public virtual DbSet<DimDateAvailable> DimDateAvailable { get; set; }
В DimDateAvailable.cs
public class DimDateAvailable
{
[Key]
public int DateId { get; set; }
}
Мой контроллер:
public class DimDateAvailableController : ODataController
{
private readonly TelemetryDbContext data;
public DimDateAvailableController(TelemetryDbContext data)
{
this.data = data;
}
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.Supported, PageSize = 2000)]
public IActionResult Get()
{
return Ok(this.data.DimDateAvailable.AsQueryable());
}
}
Это веб-приложение asp.net core 2 с пакетами Microsoft.AspNetCoreOData v7.0.1 и EntityFramework 6.2.0.