Прерывистый "Не удалось загрузить тип" System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter "" Ошибка

Я работаю над проектом, который включает компонент ASPAP WebAPI.

С перерывами я получаю следующую ошибку:

Не удалось загрузить тип 'System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter' из сборка 'System.Net.Http.Formatting, Version = 5.2.3.0, Культура = нейтральная, PublicKeyToken = 31bf3856ad364e35 '.

с исходной ошибкой, указывающей на мой вызов GlobalConfiguration.Configure():

Line 35: { 
Line 36:     AreaRegistration.RegisterAllAreas(); 
Line 37:     GlobalConfiguration.Configure(WebApiConfig.Register); //<-- error here
Line 38:     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
Line 39:     RouteConfig.RegisterRoutes(RouteTable.Routes);

В моем регистре я делаю следующее, чтобы вернуть JSON по умолчанию:

var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes
                 .FirstOrDefault(t => t.MediaType == "application/xml");

if (appXmlType != null)
{
    config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
}

(не уверен в источнике, но нашел где-то на этом сайте как способ вернуть JSON по умолчанию, если вызывающий абонент не запрашивает что-то еще)

Я хотел бы продолжать возвращать JSON в качестве типа содержимого по умолчанию в будущем.

Проект включает в себя два других (не WebAPI) веб-сайта (MVC5), которые попали на сайт WebAPI.

Вот интересная вещь:

  • Этот НЕ выполняется, когда приложение развертывается (до Azure)
  • Это случается иногда
  • Как правило, я запускаю один из сайтов MVC5 в отладчике и вижу эту проблему.
  • Если я перейду непосредственно на сайт WebAPI после указанного выше, я получу "Желтый экран смерти" с ошибкой, как указано выше.
  • Иногда, даже после холодной перезагрузки, эта ошибка НЕ ​​появится, в других случаях она будет

Что я сейчас делаю для решения этой проблемы:

  • Если я запустил сайт WebAPI в отладчике, если ошибка присутствует, он будет исправлен
  • После запуска в отладчике (см. выше) я могу перезапустить сайт MVC5 в отладчике, и проблема исчезнет.

Просто, чтобы повторить, никогда не работает, когда приложение развертывается в Azure.

У меня есть несколько разработчиков, работающих над этим проектом, и мы все на какой-то стадии сталкиваемся с той же ошибкой.

Я ссылаюсь на следующие пакеты Nuget:

  • Microsoft.AspNet.WebApi(версия 5.2.3)
  • Microsoft.AspNet.WebApi.Client(версия 5.2.3)
  • Microsoft.AspNet.WebApi.Core(версия 5.2.3)
  • Microsoft.AspNet.WebApi.Owin(версия 5.2.2)
  • Microsoft.AspNet.WebApi.WebHost(версия 5.2.3)

Если я заглянул внутрь файла *.csproj, у меня есть ссылка на следующее:

<Reference Include="System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  <HintPath>..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll</HintPath>
  <Private>True</Private>
</Reference>

Я проверил папку bin на веб-сайте, и все сборки внутри нее имеют правильную версию в соответствии с приведенным выше списком (включая System.Net.Http.Formatting.dll)..

Также обратите внимание, что во время отладки и разработки каждый из трех веб-сайтов работает под Local IIS (ограничения внешних ресурсов заставляют нас делать это), поэтому у меня есть:

  • http://localhost/site1
  • http://localhost/site2
  • http://localhost/api

Это становится громоздким, чтобы попасть в сеанс отладки, получить эту ошибку, а затем остановить отладку, запустить сайт API под отладчиком и затем вернуться к тому, что я делал в начале.

Не знаю, куда еще идти, чтобы отследить, что здесь происходит. Любые идеи?

Обновление - 26 июля 2016 г.

По-прежнему это происходит. После публикации вопроса обновили WebAPI для запуска в своем собственном пуле приложений, но это, похоже, не изменило ситуацию.

Ответ 1

Удаленный пакет Web API 2 NuGet Обновлен пакет Web API 2 NuGet.

Ответ 2

Я думаю, вы ошибетесь. Попробуйте установить JSON в качестве медиафайла по умолчанию, например:

// first clear all formatters
config.Formatters.Clear();
// Since JSON is the first added, 
// it will be the "default" if no Accept header present
config.Formatters.Add(new JsonMediaTypeFormatter());
// You can choose not to add these back if you never want to use them, 
// up to you.     
config.Formatters.Add(new XmlMediaTypeFormatter());
config.Formatters.Add(new FormUrlEncodedMediaTypeFormatter());

Ответ 3

Я добавил, что, возможно, некорректная версия System.Net.Http.Formatting для моего глобального сборочного кэша (GAC) и начала получать

Could not load type 
'System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter' from assembly
'System.Net.Http.Formatting

в моем веб-сервисе. После удаления этой System.Net.Http.Formatting dll из GAC мой веб-сервис снова начал работать.

Ответ 4

при построении ищет любое предупреждение о конфликте. Двойной щелчок по предупреждениям вводит совместимые версии в разделе web.config. Это, очевидно, также можно сделать вручную.