API 在构建 OData EdmModel 时挂起,但仅在部署到 Azure 时

问题描述 投票:0回答:1

我有一个 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 版本。我还应该注意,这是最近的问题,并且没有任何与此代码明显相关的更改。

asp.net-web-api azure-web-app-service .net-4.6.1
1个回答
0
投票

谢谢@Marc_s,是的,正如 marc_s 所说,将项目文件中的目标框架更新到更新的版本,例如

net6.0
或更高版本。

<TargetFramework>net6.0</TargetFramework>

enter image description here

  • 集成了
    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数据消息:

enter image description here

  • 我还观察到变量名称中存在拼写错误,您将 ODataConventionModelBuilder 定义为
    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()));
}
© www.soinside.com 2019 - 2024. All rights reserved.