Безсерверное приложение Asp.Net Core WebApi неправильно передает значения URL - PullRequest
1 голос
/ 24 июня 2019

У меня есть контроллер за AspNetCoreServer.APIGatewayProxyFunction (лямбда-функция AWS для маршрутизации в WebApi) с этим методом действия в моем контроллере:

[HttpGet("{id}")]
public async Task<MyClass> Get(ulong tagId)
{
    Amazon.Lambda.Core.LambdaLogger.Log($"Get(tagId) is called with {tagId}");
    return new MyClass { Id = tagId, Description = "Something" };
}

Он правильно перенаправляется на этот метод, но не передает значение, указанное как Id в URL. На самом деле проблема в том, что «id» всегда равно 0. Я изменил сигнатуру метода на «string id», но метод всегда получал пустую строку.

Удар по конечной точке APIGateway (Prod - сцена):

https://*********.execute-api.*****.amazonaws.com/Prod/api/MyController/1000

Вывод в браузере:

{
    Id: 0,
    Description: "Something",
}

Cloudwatch:

Get(TagId) is called with 0

Я развернул набор инструментов AWS из Visual Studio (также пробовал использовать лямбда-интерфейс командной строки dotnet без разницы). Я развернул API в консоли API Gateway. Есть другой метод действия, который возвращает все значения (без переданного аргумента методу), и он подходит, только этот метод действия со входом не может прочитать значение.

Внутри моего Startup.cs:

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public static IConfiguration Configuration { get; private set; }

        // This method gets called by the runtime. Use this method to add services to the container
    public void ConfigureServices(IServiceCollection services)
    {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);    
    }
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseMvc();
    }

Запуск этого кода локально с помощью «AWS .NET Mock Lambda Test Tool» будет таким же, Id будет 0.

Может кто-нибудь помочь мне здесь, пожалуйста? У меня заканчиваются идеи.

1 Ответ

0 голосов
/ 24 июня 2019

Измените tagId с ulong на long, и вы также можете использовать его в качестве ограничения маршрута.

Убедитесь, что имя параметра и имя параметра шаблона маршрута совпадают.

В действии нет кода ожидания, поэтому нет необходимости в async Task

[Route("api/MyController")]
public class MyController {
    //GET api/MyController/1000
    [HttpGet("{tagId:long}")]
    public MyClass Get(long tagId) {
        Amazon.Lambda.Core.LambdaLogger.Log($"Get(tagId) is called with {tagId}");
        return new MyClass { Id = tagId, Description = "Something" };
    }
}

Скорее всего, механизм связывания модели не может связать параметр ulong

Маршрутизацияв ASP.NET Core: ссылка на ограничение маршрута

...