HttpPost с параметром JSON не работает в ASP.NET Core 3 - PullRequest
1 голос
/ 22 октября 2019

Итак, я перенес свой проект RestAPI в ASP.NET Core 3.0 из ASP.NET Core 2.1, а ранее работавшая функция HttpPost перестала работать.

    [AllowAnonymous]
    [HttpPost]
    public IActionResult Login([FromBody]Application login)
    {
        _logger.LogInfo("Starting Login Process...");

        IActionResult response = Unauthorized();
        var user = AuthenticateUser(login);

        if (user != null)
        {
            _logger.LogInfo("User is Authenticated");
            var tokenString = GenerateJSONWebToken(user);

            _logger.LogInfo("Adding token to cache");
            AddToCache(login.AppName, tokenString);                

            response = Ok(new { token = tokenString });

            _logger.LogInfo("Response received successfully");
        }

        return response;
    }

Теперь объект входа в систему имеет значение nullзначения для каждого свойства. Я читаю здесь , что

По умолчанию, когда вы вызываете AddMvc () в Startup.cs, JSONInputFormatter форматируется JSON автоматически, но вы можете добавить дополнительные форматерыесли вам нужно, например, связать XML с объектом.

Поскольку AddMvc был удален в aspnetcore 3.0, теперь я чувствую, что по этой причине я больше не могу получить свой объект JSON. Моя функция запуска класса Configure выглядит следующим образом:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
       if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseAuthentication();
        app.UseRouting();
        //app.UseAuthorization();
        //app.UseMvc(options
        //    /*routes => {
        //    routes.MapRoute("default", "{controller=Values}/{action}/{id?}");
        //}*/);
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapRazorPages();
        });
    }

Debugging the logging object

Запрос, который я отправляю через почтальона (выбраны параметры raw и JSON)

{"AppName": "XAMS", "licenseKey": "XAMSLicenseKey"}

ОБНОВЛЕНИЯ

Почтальон Заголовок: Содержимое-Тип: application / json

Startup.cs

public void ConfigureServices(IServiceCollection services)
    {            
        //_logger.LogInformation("Starting Log..."); //shows in output window

        services.AddSingleton<ILoggerManager, LoggerManager>();

        services.AddMemoryCache();
        services.AddDbContext<GEContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        //services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
        services.AddControllers();
        services.AddRazorPages();

        //Authentication
        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        }).AddJwtBearer(options =>
        {
            options.Authority = "https://localhost:44387/";
            options.Audience = "JWT:Issuer";
            options.TokenValidationParameters.ValidateLifetime = true;
            options.TokenValidationParameters.ClockSkew = TimeSpan.FromMinutes(5);
            options.RequireHttpsMetadata = false;
        });

        services.AddAuthorization(options =>
        {
            options.AddPolicy("GuidelineReader", p => {
                p.RequireClaim("[url]", "GuidelineReader");
            });
        });
        //
    }

Application.cs

 public class Application
 {
    public string AppName;
    public string licenseKey;
 }

1 Ответ

1 голос
/ 23 октября 2019

Когда вы обновили код, я думаю, причина в том, что вы не создали setter для своих свойств.

Чтобы устранить проблему, измените модель Application, как показано ниже:

public class Application
{
    public string AppName  <b>{get;set;}</b>
    public string licenseKey <b> {get;set;}</b>
}
...