46 votes

Argument de Type 'System.Net.Http.Les en-têtes.MediaTypeHeaderValue' viole la contrainte de paramètre de type "T"

J'ai une API Web (solution de ciblage .NET 4.6) avec un couple d'assez léger .NET de Base des projets. J'ai emballé le .NET de Base des projets comme un package NuGet et les a installés sur le projet d'API Web.

Tout s'appuie bien, mais lors de l'exécution, je reçois l'exception suivante lorsque l'application est en cours d'initialisation.

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 l'explorateur d'Objets, et MediaTypeHeaderValue ne mettre en oeuvre ICloneable. Les idées de ce que pourrait être la cause?

Je dois aussi dire que c'est très bien quand j'ai remplacer la .NET de Base des projets .NET de 4,6 versions.

Modifier

Comme par Johnathan de réponse, j'ai réussi à le faire fonctionner par projet de mise à jour.json à utiliser le Système.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"
    }
  }
}

41voto

milanio Points 2337

Il n'était pas immédiatement clair pour moi ce que je fais quand j'ai lu la bonne réponse ci-dessus - Pour ceux en cours d'exécution dans la même problématique : il suffit de changer/ajouter le mappage dans votre application.config / web.config dans la configuration/runtime/assemblyBinding section:

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

Mise à JOUR

.Net de base de l'équipe de mise à jour du Système.Net.Http paquet 4.3.1 sur 21/2/2017. Donc, si vous pouvez mettre à jour vous ne devriez pas besoin de rediriger plus.

Les détails de la question: https://github.com/dotnet/corefx/issues/11100

37voto

Jonathan Points 346

C'est un problème avec la dernière version NuGet de Système.Net.Http. Pour l'instant, soit une décote de la Système.Net.Http v4.0.0.0 ou utiliser la version intégrée dans le Cadre 4.6.

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

18voto

Gertjan Points 51

Mise à niveau vers la version 4.3.0 de Système.Net.Http résolu pour moi

1voto

gperrego Points 111

J'ai eu une erreur similaire dans un ServiceFabric application après l'ajout de la eventflow pépite de colis à un WebAPI microservice. J'ai essayé de mettre à jour le Système individuel.Net.Http nuGet et cela ne fonctionne pas, mais alors j'ai juste mis à jour tous les packages nuGet et l'erreur a disparu.

Clic droit sur le projet et choisissez Gérer les packages NuGet, aller à des mises à jour et de mise à jour de tous les. Ce n'mise à niveau m'principalement à 4.3, mais il y avait d'autres paquets nécessaires mises à jour également.

Espérons que cela aide :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X