Asp Net Core Web Api POST-запрос. Длина всегда 0 - PullRequest
0 голосов
/ 20 декабря 2018

Я работаю над службой, которая получит файл, используя HTTP Content-Type: application / octet-stream и Transfer-Encoding: chunked.

Мне удалось заставить сервер получить запрос DisableFormValueModelBinding и RequestSizeLimit .

Но когда я иду, чтобы получить данные из запроса. Длина тела всегда равна 0.

В Framework я бы использовал что-то вроде request.Content.ReadAsStreamAsync ();Но, похоже, это не вариант для Core.

Как я могу получить содержимое потока, исходящего от клиента (Почтальон)?

Используя Почтальон, я попробовал двоичный файл иопции данных формы для тела, но ни у одного из них не было тела после того, как оно достигло сервера.При чтении некоторой документации были предложения по созданию нового форматера, который использовал MultipartReader.Но все это выглядело как наличие содержимого типа multipart / form-data, которое я не использую.Я также пытался использовать curl для отправки запроса, но результаты были такими же.

Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

Startup.cs

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

    public IConfiguration Configuration { get; }

    // 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_2);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

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

Контроллер

[HttpPost]
[RequestSizeLimit(2147483648)] // https://stackoverflow.com/questions/43305220/form-key-or-value-length-limit-2048-exceeded
[DisableFormValueModelBinding] // https://dotnetcoretutorials.com/2017/03/12/uploading-files-asp-net-core/
public void Upload()
{
    Request.EnableRewind();
    Stream body = Request.Body;
    Debug.WriteLine(body.Length);
}

1 Ответ

0 голосов
/ 20 декабря 2018

Я прочитал эту статью , откуда вы взяли [DisableFormValueModelBinding].Весь смысл этого атрибута состоит в том, чтобы мешать ASP.NET читать тело.Так что было бы понятно, почему body.Length равно 0. Он просто еще не прочитан (и вы не можете знать длину, пока не прочитаете все это).

Но вы можете прочитатьContent-Length заголовок запроса:

var length = Request.ContentLength;
...