Um complemento à resposta que @AndreiU já deu e como reproduzir erros de execução localmente.
Recebi o erro de tempo de execução abaixo ao implantar no Azure, não localmente.
Não foi possível carregar o arquivo ou assembly 'System.Net.Http, Version = 4.2.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' ou uma de suas dependências. O sistema não pode encontrar o arquivo especificado. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" em Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n em Company.Project .BackOffice.Web.Controllers.OrderController..ctor () em C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: linha 30 \ r \ n em lambda_method ( Closure) \ r \ n em System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (solicitação HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}} Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a 'ou uma de suas dependências. O sistema não pode encontrar o arquivo especificado. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" em Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n em Company.Project .BackOffice.Web.Controllers.OrderController..ctor () em C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: linha 30 \ r \ n em lambda_method ( Closure) \ r \ n em System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (solicitação HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}} Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a 'ou uma de suas dependências. O sistema não pode encontrar o arquivo especificado. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" em Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n em Company.Project .BackOffice.Web.Controllers.OrderController..ctor () em C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: linha 30 \ r \ n em lambda_method ( Closure) \ r \ n em System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (solicitação HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}}
Quando comecei a olhar para os assemblies, pude ver que meu projeto da web e projeto de serviço visavam versões diferentes para System.Net.Http
.
Projeto web:
Projeto de serviço:
É fácil pensar que isso é causado por uma incompatibilidade de versões, mas a chave aqui é examinar o erro The system cannot find the file specified.
.
Olhando para a propriedade de caminho, podemos ver que o projeto da web tem como alvo um assembly .Net Framework enquanto o serviço tem como alvo um assembly do Visual Studio 2017. Como o servidor não tem o Visual Studio 2017 instalado, o erro de tempo de execução ocorrerá.
Caminho da web:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.Http.dll
Caminho do serviço:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll
Algo tão simples como a criação Copy Local
de true
pode corrigir o problema, porém não em todos os casos.
Para reproduzir o erro em sua máquina local, basta remover o necessário System.Net.Http.dll
da pasta específica do Visual Studio. Isso lhe dará o erro de tempo de execução e provavelmente alguns erros de compilação. Depois de consertados, tudo deve funcionar, pelo menos funcionou para mim.
Se você instalou System.Net.Http
via, NuGet
verifique qual assembly é usado, observando a .csproj
versão. System.Net.Http 4.3.4
dá a seguinte montagem, por exemplo:
<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>
Se você usar um servidor de compilação como Jenkins, TeamCity ou AppVeyor, o tempo de execução ausente também .dll
pode existir lá. Nesse caso, pode não ajudar usar a versão NuGet de System.Net.Http ou excluir o que está faltando .dll
localmente. Para resolver este erro observe a versão que não foi encontrada e a específica PublicKeyToken
. Depois disso, crie um redirecionamento de ligação em um Web.config
ou App.config
dependendo do seu projeto. No meu caso, gostaria de usar 4.0.0.0 em vez disso:
<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>
Um bom tópico do Github sobre o problema:
https://github.com/dotnet/corefx/issues/22781