Я использую ActionFilterAttribute
, чтобы получить запрос до нажатия контроллера, как показано ниже:
public override void OnActionExecuting(HttpActionContext actionContext)
{
using (var stream = new MemoryStream())
{
HttpContextBase context = (HttpContextBase)actionContext.Request.Properties["MS_HttpContext"];
context.Request.InputStream.Seek(0, SeekOrigin.Begin);
context.Request.InputStream.CopyTo(stream);
requestBody = Encoding.UTF8.GetString(stream.ToArray());
}
}
Приведенный выше метод работает для небольшого запроса, но для большого JSON он дает мне эту ошибку:
Доступ к BinaryRead, Form, Files или InputStream осуществлялся до того, как внутреннее хранилище было заполнено вызывающей стороной HttpRequest.GetBufferedInputStream.
И входной поток выдает эту ошибку
context.Request.InputStream вызвал исключение типа System.InvalidOperationException System.IO.Stream {System.InvalidOperationException}
Как я обнаружил в своем исследовании, это проблема времени ожидания, но я не могу изменить время ожидания в коде. Я попытался изменить значения в файле web.config maxRequestLength="102400000"
и maxAllowedContentLength="209715100"
, но все еще сталкиваюсь с той же ошибкой.
Если я читаю GetBufferedInputStream
, но проблема остается той же, то это чтение только части буфера, а не всего потока.
Я также попробовал следующее:
Stream InStream;
int Len;
InStream = HttpContext.Current.Request.InputStream;
Len = System.Convert.ToInt32(InStream.Length);
byte[] ByteArray = new byte[Len + 1];
InStream.Seek(0, SeekOrigin.Begin);
InStream.Read(ByteArray, 0, Len);
var jsonParam = System.Text.Encoding.UTF8.GetString(ByteArray);
Обратите внимание, что если я установлю тип контента application/xml
или application/x-www-form-urlencoded
, он будет работать, но если я установлю его на application/json
, это выдаст мне эту ошибку !!
Пожалуйста, сообщите!