web-dev-qa-db-fra.com

L'argument de type 'System.Net.Http.Headers.MediaTypeHeaderValue' viole la contrainte du paramètre de type 'T'

J'ai une solution API Web (ciblant .NET 4.6) avec quelques projets assez légers .NET Core. J'ai regroupé les projets .NET Core dans un package NuGet et les ai installés dans le projet API Web.

Tout se passe bien, mais lors de son exécution, j'obtiens l'exception suivante lors de l'initialisation de l'application.

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

J'ai vérifié dans le navigateur d'objets et MediaTypeHeaderValue implémente ICloneable. Des idées ce qui pourrait être la cause?

Je devrais également dire que je peux me permettre de remplacer les projets .NET Core par des versions .NET 4.6.

Modifier

Selon la réponse de Johnathan, j'ai réussi à le faire fonctionner en mettant à jour project.json pour qu'il utilise System.Net.Http 4.0.0.0 pour .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"
    }
  }
}
38
Tom

C'est un problème avec la dernière version NuGet de System.Net.Http . Pour l'instant, rétrogradez System.Net.Http vers v4.0.0.0 ou utilisez la version intégrée à Framework 4.6.

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

33
Jonathan

Je ne savais pas immédiatement quoi faire lorsque je lisais la bonne réponse ci-dessus - Pour ceux qui rencontrent le même problème: il suffit de modifier/ajouter le mappage dans votre app.config/web.config dans la section configuration/runtime/assemblyBinding:

  <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>

METTRE &AGRAVE; JOUR 

L'équipe de base .Net a mis à jour le paquet System.Net.Http vers 4.3.1 le 21/02/2017. Donc, si vous pouvez mettre à jour, vous ne devriez plus avoir besoin de cette redirection. 

Détails du problème: https://github.com/dotnet/corefx/issues/11100

34
milanio

La mise à niveau vers la version 4.3.0 de System.Net.Http l'a résolue pour moi

13
Gertjan

Une erreur similaire s'est produite dans une application ServiceFabric après l'ajout des packages de nugget Eventflow à un microservice WebAPI. J'ai essayé de mettre à jour l'individu System.Net.Http nuGet et cela n'a pas fonctionné, mais je viens de mettre à jour tous les paquets nuGet et l'erreur a disparu.

Cliquez avec le bouton droit sur le projet et choisissez Gérer les packages NuGet, accédez aux mises à jour et mettez-les à jour. Cela m’a principalement mis à jour vers la version 4.3, mais d’autres packages nécessitaient également des mises à jour.

J'espère que cela pourra aider :)

1
gperrego