【问题标题】:Intermittent "Could not load type 'System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter'" Error间歇性“无法加载类型'System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter'”错误
【发布时间】:2016-01-25 21:11:53
【问题描述】:

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

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

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

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

更新 - 2016 年 7 月 26 日

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

【问题讨论】:

  • 尝试将 "Copy to local" 设置为 true 以获取 System.Net.Http.Formatting 参考
  • 感谢您的评论 - Copy to local 已设置为 true 有一段时间了 - 似乎没有什么不同。
  • 可能您的bin 文件夹(部署时)包含一个System.Net.Http.Formatting.dll;删除它,运行时System.Net.Http.Formatting.dll 将被使用。
  • @josejuan - 我知道回复晚了,但这是多次完成的,包括干净的构建和新的机器,问题总是会回来。

标签: asp.net-web-api


【解决方案1】:

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

【讨论】:

  • 我会试一试,看看我能找到什么。我怀疑它会解决这个问题,因为最近克隆 repo 的新开发人员也会遇到这个问题。
【解决方案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

我的 Web 服务中的错误。从 GAC 中删除此 System.Net.Http.Formatting dll 后,我的网络服务又开始工作了。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      相关资源
      最近更新 更多