Core 2.1 HttpRequest.Body при попытке прочитать его пусто - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь прочитать потоковые данные из HttpRequest.Body, но получаю пустую строку.Запрос отправляется сюда из проекта .net

        HttpWebRequest request = null;
        Uri uri = new Uri(**Endpoint**);
        UTF8Encoding encoding = new UTF8Encoding();
        byte[] bytes = encoding.GetBytes(message);
        request = (HttpWebRequest)WebRequest.Create(uri);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = bytes.Length;
        request.UseDefaultCredentials = true;
        using (Stream writeStream = request.GetRequestStream()) {
            writeStream.Write(bytes, 0, bytes.Length);
        }
        try {
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK) {
                return true;
            } else {
                return false;
            }
        } catch {
            lock (endpointLock) {
                _pushHttpEndpoint = null;
            }
            return false;
        }

Запрос отправляется здесь. Это приложение .net core 2.1.Я пытаюсь прочитать данные в теле запроса, но они возвращаются пустыми

    [HttpPost]
    public string Post()
    {
        var bodyStr = "";
        var req = HttpContext.Request;           
        req.EnableRewind();            
        using (StreamReader reader
                  = new StreamReader(req.Body, Encoding.UTF8, true, 1024, true))
        {
            bodyStr = reader.ReadToEnd();
        }    

        req.Body.Seek(0, SeekOrigin.Begin);
        //do other stuff
        return bodyStr;
     }

Может кто-нибудь, пожалуйста, помогите мне с этим.Мы находимся в положении, когда мы не можем изменить код решения .net.Любые изменения должны быть сделаны на стороне решения .net core.Мы пытаемся приспособить новый API вместо существующей конечной точки.(

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Ваш тип "type is application / x-www-form-urlencoded", поэтому используйте атрибут [FromForm].Код ниже для вашей справки:

.Net проект:

        HttpWebRequest request = null;
        Uri uri = new Uri("https://localhost:44365/Home/Post");
        UTF8Encoding encoding = new UTF8Encoding();
        var postData = "thing1=hello";
        postData += "&thing2=world";
        byte[] bytes = encoding.GetBytes(postData);
        request = (HttpWebRequest)WebRequest.Create(uri);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = bytes.Length;
        request.UseDefaultCredentials = true;
        using (Stream writeStream = request.GetRequestStream())
        {
            writeStream.Write(bytes, 0, bytes.Length);
        }
        try
        {
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK)
            {
                //return true;
            }
            else
            {
               // return false;
            }
        }
        catch(Exception e)
        {

        }

В вашем .net Core Project:

    [HttpPost]
    public string Post([FromForm]AcceptValue acceptValue)
    {

        //do other stuff
        return "";
    }

    public class AcceptValue {
        public string thing1 { get; set; }

        public string thing2 { get; set; }
    }

Result :

0 голосов
/ 19 августа 2019

Сначала я знаю, что вопрос касается ASP.NET Core 2.1, но у меня была такая же проблема на 2.2.

Вот как я это решил:

Способ включить это в ASP.NET Core 2.2 следующий:

Сначала включите буферизацию на уровне конвейера запросов. Это делается в классе Startup.cs.

  public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  {

    // Configure the HTTP request pipeline.
    app.Use(async (context, next) =>
    {
      //enable buffering of the request

      context.Request.EnableBuffering();

      await next();

    });
  }

Второй внутри вашего действия:

  Request.EnableRewind();
  Request.Body.Seek(0, SeekOrigin.Begin);

  using (var reader = new StreamReader(Request.Body, Encoding.ASCII))
  {
    var requestBody = reader.ReadToEnd();
    // Reset the stream just in case it is needed further down the execution pipeline       
    Request.Body.Seek(0, SeekOrigin.Begin);
  }
0 голосов
/ 20 ноября 2018

Вы должны использовать атрибут [FromBody].

Это будет так:

[HttpPost]
public string Post([FromBody] object body) {
// do stuff here
}
...