我有一个 ASP.NET Web API,其中 OData 在 .NET 4.6.1 和 Azure 应用服务中运行。在启动过程中,它为几个非常简单的实体构建并注册 OData EdmModel。它在构建 EdmModel 时挂起,CPU 使用率飙升至 100%,变得无响应,AppService 最终终止并重新启动该进程。这是最近的问题。
我已将其简化为以下示例:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IConfiguration configuration)
{
var odataBuilder = new ODataConventionModelBuilder();
odataBuilder.EntitySet<Foo>("Foos");
var edmModel = builder.GetEdmModel(); // hangs here
app.UseMvc(builder => builder.MapODataServiceRoute("odata", "odata", edmModel, new DefaultODataBatchHandler());
}
其中
Foo
是一个简单的类,包含一些 int、long、string 和 DateTimeOffset 字段。我已经在 odata/Foos
处尝试过使用和不使用关联控制器,无论哪种方式,结果都是相同的。
删除
odataBuilder.EntitySet<Foo>("Foos");
可以避免这个问题,但显然不是很有用。
有什么想法可以进一步解决此问题吗?
我还将 OData 包更新到最新的 7.x 版本。我还应该注意,这是最近的问题,并且没有任何与此代码明显相关的更改。
谢谢@Marc_s,是的,正如 marc_s 所说,将项目文件中的目标框架更新到更新的版本,例如
net6.0
或更高版本。
<TargetFramework>net6.0</TargetFramework>
GetEdmModel
方法来构建和注册OData EdmModel。异步构建 EdmModel
以避免阻塞主线程。 GetEdmModel
方法可能会因同步执行而导致挂起。程序.cs:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.OData.Builder;
using Microsoft.AspNetCore.OData.Extensions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.OData.Edm;
namespace WebApplication10
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
// Build and register OData EdmModel
var edmModel = GetEdmModel();
app.UseEndpoints(endpoints =>
{
endpoints.MapODataRoute("odata", "odata", edmModel);
endpoints.MapControllers();
});
app.Run();
}
private static IEdmModel GetEdmModel()
{
var odataBuilder = new ODataConventionModelBuilder();
odataBuilder.EntitySet<Foo>("Foos");
return odataBuilder.GetEdmModel();
}
}
}
O数据消息:
odataBuilder
,但随后您尝试使用 builder.GetEdmModel();
获取 EdmModel。变量名称不匹配可能会导致 NullReferenceException
,并且应用程序在尝试构建 EdmModel 时挂起。代码:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IConfiguration configuration)
{
var odataBuilder = new ODataConventionModelBuilder();
odataBuilder.EntitySet<Foo>("Foos");
var edmModel = odataBuilder.GetEdmModel(); // Corrected variable name
app.UseMvc(builder => builder.MapODataServiceRoute("odata", "odata", edmModel, new DefaultODataBatchHandler()));
}