使用端点映射时如何读取请求正文?

How am I able to read the Request-Body when using endpoint mapping?

对不起,伙计们,这似乎是一个新手问题,但我以前从未使用过端点映射,而且似乎无法弄清楚。

所以我写了一个监听请求的服务,请求的主体包含一个 json 对象,我的服务需要它来正确处理请求。 虽然我知道如何将这些请求路由到适当的控制器,但我只是不知道我应该如何读取请求正文并将其传递给控制器​​。

Startup.cs

class Startup
    {
        private readonly IHostingEnvironment _env;
        private readonly IConfiguration _config;
        private readonly ILoggerFactory _loggerFactory;

        public Startup(IHostingEnvironment env, IConfiguration config,
            ILoggerFactory loggerFactory)
        {
            _env = env;
            _config = config;
            _loggerFactory = loggerFactory;
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddRouting();
            services.AddMvc();

        }
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseMvc(routes =>
            {
                routes.MapRoute("default", "{controller=Classifier}/{action}");
            });
        }
    }

控制器

 public class ClassifierController : Controller
    {
        private Classifier documentClassifier = new Classifier();

        public TrainingResponse Training(RequestTrainingData requestDataTrain)
        {
            return documentClassifier.Train(requestDataTrain);
        }

        public PredictionResponse Predict(RequestPredictionData requestDataPredict)
        {
            return documentClassifier.Predict(requestDataPredict);
        }
    }

如您所见,我希望得到类型为 RequestPredictionData 或 RequestTrainingData 的对象:

RequestPredictionData

    public class RequestPredictionData
    {
        public string Principal { get; set; }
        public IEnumerable<PredictionInputDocument> Docs { get; set; }
    }

请求训练数据

    public class RequestTrainingData
    {
        public string Principal { get; set; }
        public IEnumerable<TrainingDocument> Docs { get; set; }
    }

抱歉,文本太长了,感谢所有花时间阅读我的问题的人^^'

它看起来就像您需要一个 Web API。像这样:

请使用WebApi配置:

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

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<TodoContext>(opt =>
           opt.UseInMemoryDatabase("TodoList"));
        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

那么你应该用属性标记你的控制器

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

并将您的方法标记为POST

[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public ActionResult<Pet> Create(Pet pet)
{
    pet.Id = _petsInMemoryStore.Any() ? 
             _petsInMemoryStore.Max(p => p.Id) + 1 : 1;
    _petsInMemoryStore.Add(pet);

    return CreatedAtAction(nameof(GetById), new { id = pet.Id }, pet);
}

所以,您可以在这里阅读 mo: https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-3.0&tabs=visual-studio

https://docs.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-3.0