2016-07-13 50 views
33

Ho una soluzione API Web (con targeting .NET 4.6) con un paio di progetti .NET Core abbastanza leggeri. Ho impacchettato i progetti .NET Core come pacchetto NuGet e li ho installati nel progetto Web API.L'argomento Type 'System.Net.Http.Headers.MediaTypeHeaderValue' viola il vincolo del parametro type 'T'

Tutto si comporta bene, ma durante l'esecuzione, ottengo la seguente eccezione quando l'applicazione è in fase di inizializzazione.

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 

Ho controllato in Object Browser e MediaTypeHeaderValue fa implementare ICloneable. Qualche idea su cosa potrebbe causare questo?

Devo anche dire che va bene quando sostituisco i progetti .NET Core con versioni .NET 4.6.

Modifica

Come per la risposta di Johnathan, sono riuscito a farlo funzionare aggiornando project.json utilizzare 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" 
    } 
    } 
} 

risposta

27

E ' un problema con l'ultima versione NuGet di System.Net.Http. Per ora, è possibile effettuare il downgrade di System.Net.Http alla v4.0.0.0 o utilizzare la versione integrata in Framework 4.6.

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

+0

Impostazione a 4.0.0 o andare a .Net 4.6 non risolto qui .... Ho letto un sacco online, ma non può risolvere il problema qui. Mi potete aiutare? –

+0

sono stati fatti progressi su questo problema? –

24

non è stato subito chiaro per me che cosa fare quando ho letto la risposta corretta sopra - Per quelli in esecuzione lo stesso problema: basta cambiare/aggiungere il mapping nel vostro app.config/web.config nella configurazione/runtime/sezione 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> 

UPDATE

Net nucleo centrale aggiornato pacchetto System.Net.Http a 4.3.1 il 21/2/2017. Quindi, se puoi aggiornare non dovresti più aver bisogno di questo reindirizzamento.

dettagli della questione: https://github.com/dotnet/corefx/issues/11100

+0

Con questa soluzione si potrebbe avere la sfortuna di ottenere un problema di runtime se si utilizza una funzionalità aggiunta in [System.Net.Http 4.1] (https://github.com/dotnet/core/blob/master/ release-notes/1.0/RC2-Final_API_diff.md # systemnethttp). La soluzione più sicura sarebbe l'aggiornamento a System.Net.Http 4.3 come @Gertjan menzionato. – lgrosales

+0

In realtà non è così facile @Igrosales. Questa soluzione alternativa era/è effettivamente necessaria se si utilizza System.Net.Http 4.3.0. Il problema è tracciato dal team di nucleo di .net qui: https://github.com/dotnet/corefx/issues/11100 Ecco perché hai avuto bisogno di questo reindirizzamento ed è per questo che in alcune situazioni si è scatenato l'inferno quando si è tentato di utilizzare il nucleo .net (pcl) libreria in pieno .net. La soluzione consigliata è l'aggiornamento a System.Net.Http 4.3.1 – milanio

8

l'aggiornamento alla versione 4.3.0 di System.Net.Http risolto per me

1

ho avuto un errore simile in un'applicazione ServiceFabric dopo aver aggiunto i pacchetti eventflow pepita di un microservizio WebAPI. Ho provato ad aggiornare il singolo nuGet di System.Net.Http e questo non ha funzionato, ma ho solo aggiornato tutti i pacchetti nuGet e l'errore è andato via.

Fare clic con il tasto destro del mouse sul progetto e selezionare Gestisci pacchetti NuGet, vai agli aggiornamenti e aggiorna tutto. Questo mi ha fatto passare principalmente a 4.3 ma c'erano anche altri pacchetti che necessitavano di aggiornamenti.

Speranza che aiuta :)

Problemi correlati