在ASP.NET Core 3中,使用JSON参数的HttpPost无法正常工作

3

所以,我将自己的RestAPI项目从ASP.NET Core 2.1迁移到了ASP.NET Core 3.0,之前运行正常的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值。我在这里阅读到(链接):

默认情况下,当您在Startup.cs中调用AddMvc()时,会自动配置一个JSON格式化程序JsonInputFormatter,但是如果需要,您可以添加其他格式化程序,例如将XML绑定到对象。

由于在aspnetcore 3.0中已经删除了AddMvc,现在我感觉这就是为什么我无法再获取我的JSON对象了。我的Startup类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();
        });
    }

日志对象的调试

我通过Postman发送了一个请求(选择了原始文本和JSON选项)

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

更新

Postman头部: Content-Type: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. 你获得了什么状态码?
  2. 你是如何发送有效载荷的?请同时包含 JavaScript 代码。
- itminus
这是一个API。我没有使用JavaScript。在调试时,我已经注释了大部分内容 - 附上了图片。 - Samra
实际上,我使用您的代码创建了一个新的v3.0.100项目,但是您的有效载荷对我很好用。我怀疑您在这里没有展示的代码中是否有问题。您是否配置了自定义服务/模型绑定器/过滤器? - itminus
我在Postman的更新部分添加了更多代码。我还创建了另一个应用程序,只是将此httppost函数和application.cs复制到那里,并注释掉其他所有内容,但它没有工作:S... - Samra
你尝试过在启动时添加JSON序列化的内容吗?还有一种发送JSON对象的方式,可以使用蛇形命名法进行序列化。 - Eliotjse
1个回答

3

根据您的更新代码,我认为问题出在您没有为您的属性创建 setter

要解决此问题,请将您的 Application 模型更改如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接