Una adición a la respuesta que @AndreiU ya dio y cómo reproducir los errores de tiempo de ejecución localmente.
Recibí el siguiente error de tiempo de ejecución al implementar en Azure, no localmente.
No se pudo cargar el archivo o ensamblado 'System.Net.Http, Version = 4.2.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' o una de sus dependencias. El sistema no puede encontrar el archivo especificado. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" en Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n en Company.Project .BackOffice.Web.Controllers.OrderController..ctor () en C: \ proyectos \ empresa-proyecto \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: línea 30 \ r \ n en lambda_method ( Closure) \ r \ n en System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (solicitud HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}} Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a 'o una de sus dependencias. El sistema no puede encontrar el archivo especificado. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" en Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n en Company.Project .BackOffice.Web.Controllers.OrderController..ctor () en C: \ proyectos \ empresa-proyecto \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: línea 30 \ r \ n en lambda_method ( Closure) \ r \ n en System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (solicitud HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}} Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a 'o una de sus dependencias. El sistema no puede encontrar el archivo especificado. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" en Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n en Company.Project .BackOffice.Web.Controllers.OrderController..ctor () en C: \ proyectos \ empresa-proyecto \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: línea 30 \ r \ n en lambda_method ( Closure) \ r \ n en System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (solicitud HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}}
Cuando comencé a buscar ensamblajes, pude ver que mi proyecto web y mi proyecto de servicio apuntaban a diferentes versiones de System.Net.Http
.
Proyecto web:
Proyecto de servicio:
Es fácil pensar que esto se debe a una discrepancia en las versiones, pero la clave aquí es mirar el error The system cannot find the file specified.
.
Al observar la propiedad de la ruta, podemos ver que el proyecto web tiene como objetivo un ensamblado .Net Framework mientras que el servicio tiene como objetivo un ensamblado de Visual Studio 2017. Dado que el servidor no tiene Visual Studio 2017 instalado, se producirá el error de tiempo de ejecución.
Ruta web:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.Http.dll
Ruta de servicio:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll
Algo tan simple como la creación Copy Local
de true
puede solucionar el problema, sin embargo, no en todos los casos.
Para reproducir el error en su máquina local, simplemente elimine lo necesario System.Net.Http.dll
de la carpeta específica de Visual Studio. Esto le dará el error de tiempo de ejecución y probablemente algunos errores de compilación. Después de que estos estén arreglados, todo debería funcionar, al menos a mí me funcionó.
Si ha instalado System.Net.Http
mediante, NuGet
compruebe qué ensamblaje se utiliza mirando la .csproj
versión. System.Net.Http 4.3.4
da el siguiente montaje, por ejemplo:
<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
Si usa un servidor de compilación como Jenkins, TeamCity o AppVeyor, el tiempo de ejecución que falta también .dll
puede existir allí. En este caso, es posible que no sirva de ayuda usar la versión NuGet de System.Net.Http o eliminar .dll
localmente lo que falta . Para solucionar este error mire la versión que no se encuentra y la específica PublicKeyToken
. Después de eso, cree un redireccionamiento vinculante en cualquiera de los dos Web.config
o App.config
dependiendo de su proyecto. En mi caso, me gustaría usar 4.0.0.0 en su lugar:
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
Un buen hilo de Github sobre el problema:
https://github.com/dotnet/corefx/issues/22781