Привязка Json Web API к модели иногда вызывает исключение - PullRequest
0 голосов
/ 15 января 2019

У меня есть WebAPI (не знаю, какая версия, но она была создана в VS2017), которая получает строку Json и привязывает ее к модели в контроллере. Большую часть времени это работает просто отлично. Иногда он выдает исключение при первом обращении к экземпляру класса. Ясно, что подпрограммы привязки терпят неудачу, но сообщение об исключении не помогает: ссылка на объект не установлена ​​для экземпляра объекта. Я предполагаю, что механизм связывания не работает и даже не создает пустой экземпляр моего объекта.

Я записываю строку Json перед вызовом API, чтобы проверить строку на наличие проблем. Я определил, что определенные символы Unicode (такие как Trademark TM) могут вызвать сбой, поэтому я управляю ими.

Но у меня есть пара последних строк Json, которые выдают исключение, и я не могу понять, почему. Там нет символов Unicode, которые я могу найти. Теперь мои пользователи спрашивают, почему этот определенный стиль работы терпит неудачу.

Кажется, что после того, как InputStream прочитан внутренними процедурами привязки MVC, он никогда не сможет быть прочитан снова. Хитрость:

HttpContext.Current.Request.InputStream.Position = 0;
string streamresult = new System.IO.StreamReader(HttpContext.Current.Request.GetBufferedInputStream()).ReadToEnd();

выдает свое собственное исключение, говоря, что вызов был сделан до того, как "внутреннее хранилище было заполнено вызывающей стороной HttpRequest.GetBufferedInputStream".

  • Есть ли способ заглянуть внутрь скоросшивателя и посмотреть, что он задыхается на?
  • или есть ли способ получить лучшее сообщение об исключении?
  • или для захвата и записи входящего потока данных?

1 Ответ

0 голосов
/ 15 января 2019

Если вы хотите прочитать тело запроса, вам необходимо включить перемотка в его потоке, в противном случае тело запроса может быть прочитано только один раз, поскольку по умолчанию это поток только для пересылки.

Если вы используете ASP.NET Core MVC, вы можете включить перемотку в вашем загрузочном коде с помощью:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.Use(async (context, next) => {  // <----
        context.Request.EnableRewind();
        await next();
    });

    app.UseMvc();
}

В качестве последнего замечания я могу порекомендовать библиотеку Audit.NET с ее расширением Audit.WebApi .

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