2016-07-13 15 views
33

Ich habe eine Web-API-Lösung (Targeting .NET 4.6) mit ein paar ziemlich leichten .NET Core-Projekten darin. Ich habe die .NET Core-Projekte als NuGet-Paket verpackt und sie im Web-API-Projekt installiert.Typ-Argument 'System.Net.Http.Headers.MediaTypeHeaderValue' verletzt die Einschränkung von Typ Parameter 'T'

Alles funktioniert gut, aber beim Ausführen bekomme ich die folgende Ausnahme, wenn die Anwendung initialisiert wird.

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 

ich in Object Browser überprüft haben, und MediaTypeHeaderValue tut ICloneable implementieren. Irgendwelche Ideen, was könnte das verursachen?

Ich sollte auch sagen, dass es in Ordnung ist, wenn ich die .NET Core-Projekte durch .NET 4.6-Versionen ersetze.

bearbeiten

Per Johnathan Antwort konnte ich es durch project.json arbeiten lassen Aktualisierung verwenden System.Net.Http 4.0.0.0 for .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" 
    } 
    } 
} 

Antwort

27

Es ist ein Problem mit der neuesten NuGet-Version von System.Net.Http. Jetzt entweder das System.Net.Http auf v4.0.0.0 herunterstufen oder die in Framework 4.6 integrierte Version verwenden.

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

+0

Einstellung auf 4.0.0 oder gehen 4.6 hier nicht gelöst .NET .... ich online lesen viel, aber ich kann es hier nicht beheben. Kannst du mir helfen? –

+0

sind in diesem Bereich Fortschritte erzielt worden? –

24

Es war nicht sofort klar für mich, was zu tun ist, wenn ich die richtige Antwort oben gelesen - Für jene in der gleichen Ausgabe läuft: nur ändern/die Zuordnung in Ihrem app.config/web.config in der Konfiguration/runtime/assembly Abschnitt:

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

UPDATE

.Net Kernteam aktualisiert System.Net.Http Paket 4.3.1 am 21/2/2017. Wenn Sie also aktualisieren können, sollten Sie diese Umleitung nicht mehr benötigen.

Einzelheiten der Ausgabe: https://github.com/dotnet/corefx/issues/11100

+0

Mit dieser Lösung haben Sie möglicherweise das Pech, ein Laufzeitproblem zu bekommen, wenn Sie eine Funktion verwenden, die in [System.Net.Http 4.1] hinzugefügt wurde (https://github.com/dotnet/core/blob/master/ release-notes/1.0/RC2-Final_API_diff.md # systemnethttp). Die sicherste Lösung wäre ein Upgrade auf System.Net.Http 4.3 als @Gertjan erwähnt. – lgrosales

+0

Es ist eigentlich nicht so einfach @Igrosales. Diese Problemumgehung wurde/wird tatsächlich benötigt, wenn Sie System.Net.Http 4.3.0 verwenden. Das Problem wird vom .net-Kernteam hier verfolgt: https://github.com/dotnet/corefx/issues/11100 Deshalb brauchen Sie diese Umleitung und deshalb brach in einigen Situationen die Hölle los, als Sie versuchten, .net core zu verwenden (pcl) Bibliothek in voller .net. Die empfohlene Lösung ist ein Update auf System.Net.Http 4.3.1 – milanio

8

Upgrade auf Version 4.3.0 von System.Net.Http gelöst es für mich

1

ich nach Zugabe der eventflow Nugget-Pakete einen ähnlichen Fehler in einer Anwendung ServiceFabric musste ein WebAPI-Microservice. Ich habe versucht, die einzelnen System.Net.Http NuGet zu aktualisieren und das hat nicht funktioniert, aber dann habe ich nur alle NuGet-Pakete aktualisiert und der Fehler ging weg.

Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie NuGet-Pakete verwalten, gehen Sie zu Updates und aktualisieren Sie alle. Dies hat mich hauptsächlich auf 4.3 aktualisiert, aber es gab andere Pakete, die auch Updates benötigten.

Hoffnung, das hilft :)

Verwandte Themen