Как использовать ReadAsStringAsync в основном контроллере MVC asp.net? - PullRequest
0 голосов
/ 09 мая 2019

Как использовать ReadAsStringAsync в основном контроллере MVC asp.net?Microsoft.AspNetCore.Mvc.Request не имеет свойства Content.Есть ли альтернатива этому?Спасибо!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using AuthLibrary;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Web;
using System.Web.Http;
using System.Threading.Tasks;

[Microsoft.AspNetCore.Mvc.Route("TestAPI")]
public class TestController : Controller
{

    [Microsoft.AspNetCore.Mvc.HttpPost]
    [AllowAnonymous]
    [Microsoft.AspNetCore.Mvc.Route("Start")]
      public async Task<HttpResponseMessage> Start()
    {
        string req = await this.Request.Content.ReadAsStringAsync();

        ////

    }
}

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Для Asp.Net Core MVC вы можете получить доступ к содержимому запроса с помощью request.Body.

Вот расширение:

public static class HttpRequestExtensions
{

    /// <summary>
    /// Retrieve the raw body as a string from the Request.Body stream
    /// </summary>
    /// <param name="request">Request instance to apply to</param>
    /// <param name="encoding">Optional - Encoding, defaults to UTF8</param>
    /// <returns></returns>
    public static async Task<string> GetRawBodyStringAsync(this HttpRequest request, Encoding encoding = null)
    {
        if (encoding == null)
            encoding = Encoding.UTF8;

        using (StreamReader reader = new StreamReader(request.Body, encoding))
            return await reader.ReadToEndAsync();
    }

    /// <summary>
    /// Retrieves the raw body as a byte array from the Request.Body stream
    /// </summary>
    /// <param name="request"></param>
    /// <returns></returns>
    public static async Task<byte[]> GetRawBodyBytesAsync(this HttpRequest request)
    {
        using (var ms = new MemoryStream(2048))
        {
            await request.Body.CopyToAsync(ms);
            return ms.ToArray();
        }
    }
}

Использование:

public async Task<string> ReadStringDataManual()
{
    return await Request.GetRawBodyStringAsync();
}

Ссылка: Прием необработанного содержимого тела запроса в основных контроллерах API ASP.NET

0 голосов
/ 10 мая 2019

Вы надеетесь, что можете использовать .ReadAsStringAsync() в текущем запросе MVC, потому что, возможно, вы видели что-то подобное?

using Microsoft.AspNetCore.Mvc;
using System.Net.Http;
using System.Threading.Tasks;

namespace DL.SO.UI.Web.Controllers
{
    public class DashboardController : Controller
    {
        // In order to be able to inject the factory, you need to register in Startup.cs
        // services.AddHttpClient()
        //     .AddRouting(...)
        //     .AddMvc(...);
        private readonly IHttpClientFactory _httpClientFactory;

        public DashboardController(IHttpClientFactory httpClientFactory)
        {
            _httpClientFactory = httpClientFactory;
        }

        public async Task<IActionResult> Index()
        {
            var client = _httpClientFactory.CreateClient();

            var request = new HttpRequestMessage(HttpMethod.Get, "https://www.google.com");

            var response = await client.SendAsync(request);
            if (response.IsSuccessStatusCode)
            {
                string bodyContent = await response.Content.ReadAsStringAsync();
            }

            return View();
        }
    }
}

Так вы используете HttpClient для извлечения внешних данных / ресурсов вприложение..ReadAsStringAsync() выключен HttpContent, что является свойством либо HttpRequestMessage, либо HttpResponseMessage.HttpRequestMessage и HttpResponseMessage находятся в System.Net.Http пространстве имен.

Но теперь вы в самом приложении!Все работает немного по-другому.У нас пока нет ответа на запрос (потому что мы еще не сделали return View();).Следовательно, я предполагаю, что содержимое, которое вы хотите просмотреть, является содержимым поступающего запроса?

Содержимое запроса GET

Когда поступает запрос GET , MVC автоматическипривязать строки запроса запроса к параметрам метода действия в контроллере.Они также доступны в свойстве Query текущего объекта Request:

public IActionResult Index(int page = 1, int size = 15)
{
    foreach (var param in Request.Query)
    {
        ...
    }

    return View();
}

Содержимое запроса POST

Когда приходит запрос POST ,Request.Body не всегда может иметь данные, которые вы ищете.Это зависит от типа содержимого запроса POST .

По умолчанию при отправке формы тип содержимого запроса form-data .MVC затем свяжет входные данные с вашей моделью представления в качестве параметра действия:

[HttpPost]
public async Task<IActionResult> Close(CloseReservationViewModel model)
{
    Request.Form    // contains all the inputs, name/value pairs

    Request.Body    // will be empty!

    ...
}

Если вы используете jQuery для запуска POST запросов без указания contentType, по умолчанию он равен x-www-form-urlencoded :

@section scripts {
    <script type="text/javascript">
        $(function() {
            $.ajax({
                url: '@Url.Action("test", "dashboard", new { area = "" })',
                data: {
                    name: 'David Liang',
                    location: 'Portland Oregon'
                },
                method: 'POST'
            }).done(function (response) {
                console.info(response);
            });        
        });
    </script>
}
[HttpPost]
public async Task<IActionResult> Test()
{
    string body;
    using (var reader = new StreamReader(Request.Body))
    {
        body = await reader.ReadToEndAsync();
    }

    return Json(body);
}

enter image description here

Заключение

Если выЕсли вы хотите использовать HttpClient для вызова внешних служб внутри вашего приложения MVC, вы можете использовать IHttpClientFactory, HttpClient из System.Net.Http и получить HttpContent из запроса или ответа без особых проблем.Затем вы можете отключить ReadAsStringAsync().

Если вы хотите просмотреть данные запроса, отправленные клиентом в ваше приложение MVC, MVC уже сделал так много, чтобы помочь вам связать данные с помощью привязки модели.Вы также можете прочитать тело запроса для POST запросов с StreamReader.Просто обратите внимание, что это зависит от типа контента, Request.Body может не соответствовать ожидаемому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...