【问题标题】:How am I able to read the Request-Body when using endpoint mapping?使用端点映射时如何读取请求正文?
【发布时间】:2019-11-28 07:08:08
【问题描述】:

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

所以我编写了一个侦听请求的服务,所述请求的主体包含一个 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 类型的对象:

请求预测数据

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

RequestTrainingData

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

抱歉,文字太长了,感谢任何花时间阅读我的问题的人^^'

【问题讨论】:

标签: c# request mapping endpoint


【解决方案1】:

看起来您需要一个 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

【讨论】:

  • 感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2018-10-07
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
相关资源
最近更新 更多