Я использую 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/xml
или application/x-www-form-urlencoded
оно будет работать, но если я его установлю в application/json
он даст мне эту ошибку!
Пожалуйста, порекомендуйте!