间歇性“无法加载类型'System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter'”错误

时间:2016-01-25 21:11:53

标签: asp.net-web-api

我正在开发一个包含ASP.NET WebAPI组件的项目。

间歇性地,我收到以下错误:

  

无法加载类型   'System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter'来自   程序集'System.Net.Http.Formatting,Version = 5.2.3.0,   Culture = neutral,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站点,然后切换回我在开始时所做的事情,这变得很麻烦。

不知道还能去哪里追踪这里发生的事情。有什么想法吗?

更新 - 2016年7月26日

仍然有这种情况发生。自发布问题以来,已将WebAPI更新为在自己的应用程序池中运行,但这似乎没有什么区别。

4 个答案:

答案 0 :(得分:2)

卸载了Web API 2 NuGet包 再次安装Web API 2 NuGet包。

答案 1 :(得分:1)

我认为你错了。尝试将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());

答案 2 :(得分:0)

我已将可能不正确版本的System.Net.Http.Formatting添加到我的全局程序集缓存(GAC)并开始获取

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

我的Webservice中的错误。从GAC中删除此System.Net.Http.Formatting dll后,我的webservice又开始工作了。

答案 3 :(得分:-1)

当你构建查找任何谈论冲突的警告时。双击警告会在web.config部分中注入兼容版本。这显然也可以手动完成。