类型参数“System.Net.Http.Headers.MediaTypeHeaderValue”违反类型参数“T”的约束

Posted

技术标签:

【中文标题】类型参数“System.Net.Http.Headers.MediaTypeHeaderValue”违反类型参数“T”的约束【英文标题】:Type argument 'System.Net.Http.Headers.MediaTypeHeaderValue' violates the constraint of type parameter 'T' 【发布时间】:2016-11-16 06:28:02 【问题描述】:

我有一个 Web API 解决方案(针对 .NET 4.6),其中包含几个相当轻量级的 .NET Core 项目。我已将 .NET Core 项目打包为 NuGet 包并将它们安装到 Web API 项目中。

一切正常,但在运行它时,应用程序初始化时出现以下异常。

Method System.Net.Http.CloneableExtensions.Clone: type argument 'System.Net.Http.Headers.MediaTypeHeaderValue' violates the constraint of type parameter 'T'.

[VerificationException: Method System.Net.Http.CloneableExtensions.Clone: type argument 'System.Net.Http.Headers.MediaTypeHeaderValue' violates the constraint of type parameter 'T'.]
   System.Net.Http.Formatting.MediaTypeConstants.get_ApplicationJsonMediaType() +0
   System.Net.Http.Formatting.JsonMediaTypeFormatter..ctor() +64
   System.Net.Http.Formatting.MediaTypeFormatterCollection.CreateDefaultFormatters() +41
   System.Web.Http.HttpConfiguration.DefaultFormatters(HttpConfiguration config) +26
   System.Web.Http.HttpConfiguration..ctor(HttpRouteCollection routes) +214
   System.Web.Http.GlobalConfiguration.<CreateConfiguration>b__0() +60
   System.Lazy`1.CreateValue() +411
   System.Lazy`1.LazyInitValue() +183
   System.Lazy`1.get_Value() +75
   System.Web.Http.GlobalConfiguration.get_Configuration() +27
   Runpath.Platform.Web.DependencyResolution.StructureMapBootStrapper.Initialise() in C:\Code3\Runpath\Markets\Platform\Main - Copy\Runpath.Platform.Web\DependencyResolution\StructureMapBootStrapper.cs:15
   Runpath.Platform.Web.WebApiApplication.Application_Start() in C:\Code3\Runpath\Markets\Platform\Main - Copy\Runpath.Platform.Web\Global.asax.cs:30

[HttpException (0x80004005): Method System.Net.Http.CloneableExtensions.Clone: type argument 'System.Net.Http.Headers.MediaTypeHeaderValue' violates the constraint of type parameter 'T'.]
   System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +493
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +118
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +176
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +364
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +303

[HttpException (0x80004005): Method System.Net.Http.CloneableExtensions.Clone: type argument 'System.Net.Http.Headers.MediaTypeHeaderValue' violates the constraint of type parameter 'T'.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +770
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +95
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +195

我检查了对象浏览器,MediaTypeHeaderValue 确实实现了ICloneable。有什么想法可能导致这种情况吗?

我还应该说,当我将 .NET Core 项目替换为 .NET 4.6 版本时,这很好。

编辑

根据 Johnathan 的回复,我设法通过更新 project.json 以将 System.Net.Http 4.0.0.0 用于 .NET 4.6 来使其正常工作:


  "version": "1.0.3-*",

  "dependencies": 
    "NETStandard.Library": "1.6.0"
  ,

  "frameworks": 
    "net46": 
      "dependencies": 
        "System.Net.Http": "4.0.0"
      
    ,
    "netstandard1.6": 
      "imports": "dnxcore50"
    
  

【问题讨论】:

【参考方案1】:

当我阅读上面的正确答案时,我并不清楚该怎么做 - 对于那些遇到相同问题的人:只需在配置/运行时 / 中的 app.config / web.config 中更改/添加映射组装绑定部分:

  <dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.0.0.0" />
  </dependentAssembly>

更新

.Net 核心团队于 21/2/2017 更新了 System.Net.Http 包到 4.3.1。 因此,如果您可以更新,则不再需要此重定向。

问题详情:https://github.com/dotnet/corefx/issues/11100

【讨论】:

如果您碰巧使用System.Net.Http 4.1 中添加的功能,使用此解决方案可能会遇到运行时问题。正如@Gertjan 提到的那样,最安全的解决方案是升级到 System.Net.Http 4.3。 这实际上并不容易@Igrosales。如果您使用 System.Net.Http 4.3.0,则实际上需要此解决方法。 .net 核心团队在此处跟踪该问题:github.com/dotnet/corefx/issues/11100 这就是您需要此重定向的原因,这就是为什么在某些情况下,当您尝试在完整的 .net 中使用 .net core (pcl) 库时,一切都崩溃了。建议的解决方案是更新到 System.Net.Http 4.3.1【参考方案2】:

这是 System.Net.Http 的最新 NuGet 版本的问题。 目前,要么将 System.Net.Http 降级到 v4.0.0.0,要么使用 Framework 4.6 内置的版本。

https://github.com/dotnet/corefx/issues/9884

【讨论】:

设置为 4.0.0 或转到 .Net 4.6 此处未解决....我在网上阅读了很多内容,但在这里无法修复。你能帮我吗? 这个问题有进展吗?【参考方案3】:

升级到 System.Net.Http 4.3.0 版本为我解决了这个问题

【讨论】:

【参考方案4】:

在将事件流块包添加到 WebAPI 微服务后,我在 ServiceFabric 应用程序中遇到了类似的错误。我尝试更新单个 System.Net.Http nuGet,但没有成功,但我刚刚更新了所有 nuGet 包,错误就消失了。

右键单击项目并选择管理 NuGet 包,转到更新并全部更新。这确实主要将我升级到 4.3,但还有其他软件包也需要更新。

希望有帮助:)

【讨论】:

【参考方案5】:

using Microsoft.Net.Http.Headers; 代替 using System.Net.Http.Headers; 对我有用。

【讨论】:

以上是关于类型参数“System.Net.Http.Headers.MediaTypeHeaderValue”违反类型参数“T”的约束的主要内容,如果未能解决你的问题,请参考以下文章

获取错误“未知”类型的参数不能分配给“错误”类型的参数 |空值'

给定传递给它的参数类型,如何确定函数参数的类型?

参数类型“Type”不能分配给参数类型“FirebaseUser”

类型提示,其中一个参数是另一个参数的类型

参数类型“对象?”不能分配给参数类型'String'最新版本

Python参数类型以及常见的坑