我已经将我的项目复制到一台干净的Windows 10机器上,只安装了Visual Studio 2015 Community和SQL Server 2016 Express。除了Windows 10和VS2015或SQL Server安装的框架版本外,没有安装其他框架版本。

当我尝试启动WebApi项目时,我得到了这样的消息:

无法加载文件或程序集"System.Net。Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。系统无法找到指定的文件。

项目包包括:

<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Tracing" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net45" />

在使用。net Framework 4.6.1构建项目后,在bin文件夹中找不到System.Net.Http文件。

文件的路径指向:

C:\Program Files (x86)\Reference程序集\Microsoft\ framework.net框架\v4.6.1\System.Net.Http.dll

System.Net.Http.Formatting的文件路径指向:

C: \开发\ MyApp \ \ Microsoft.AspNet.WebApi.Client.5.2.3 \ lib \ net45 \ System.Net.Http.Formatting.dll包

整个项目应该以4.5.1为目标,还是有其他方法来引用正确的程序集?


当前回答

我在把项目从。net Framework 4.6升级到。net Framework 4.8后遇到了这个问题。在配置文件中,我仍然有旧版本的行

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>

并且服务器没有安装。net Framework 4.8。

在纠正上面的代码行之后,在服务器上安装。net Framework 4.8并重新启动它,现在它可以工作了。

其他回答

删除name="System.Net. "的dependentAssembly。Http”来自web。Config对我也有用。我从网上评论了这部分。配置,它为我工作。 如果以上所有解决方案都不适用,请尝试如下所示的注释或删除。

<!--<dependentAssembly>
        <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.0.0.0"/>
      </dependentAssembly>-->

更改我的网页中的绑定信息。config(或app.config) -虽然在我看来是一个“黑客”,允许你在NuGet包更新后继续你的项目,并给你System.Net.Http错误。

设置oldVersion="0.0.0.0-4.1.1.0"和newVersion="4.0.0.0"如下所示

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.0.0.0" />
</dependentAssembly>

对我来说,我已经将我的项目设置为在最新版本的。net Framework上运行(从。net Framework 4.6.1到4.7.2的更改)。

一切都正常工作,没有错误,发布也没有问题,只是由于偶然的机会,我遇到了System.Net.Http错误消息,它显示在我正在工作的网站上的一个很小的,很难注意到的,但非常重要的API请求中。

我回滚到4.6.1,一切恢复正常。

请遵循以下步骤:

Update Visual Studio to to latest version (it matters) Remove all binding redirects from web.config Add this to the .csproj file: <PropertyGroup> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup> Build the project In the bin folder there should be a (WebAppName).dll.config file It should have redirects in it, copy these to the web.config Remove the above snipped from the .csproj file

它应该会起作用。

你可以通过将项目升级到. net Framework 4.7.2来解决这个问题。这个问题由微软的Alex giondea回答。请给他投票,因为他真的值得!

This is documented as a known issue in .NET Framework 4.7.1. As a workaround you can add these targets to your project. They will remove the DesignFacadesToFilter from the list of references passed to SGEN (and add them back once SGEN is done) <Target Name="RemoveDesignTimeFacadesBeforeSGen" BeforeTargets="GenerateSerializationAssemblies"> <ItemGroup> <DesignFacadesToFilter Include="System.IO.Compression.ZipFile" /> <_FilterOutFromReferencePath Include="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" Condition="'@(DesignFacadesToFilter)' == '@(_DesignTimeFacadeAssemblies_Names)' and '%(Identity)' != ''" /> <ReferencePath Remove="@(_FilterOutFromReferencePath)" /> </ItemGroup> <Message Importance="normal" Text="Removing DesignTimeFacades from ReferencePath before running SGen." /> </Target> <Target Name="ReAddDesignTimeFacadesBeforeSGen" AfterTargets="GenerateSerializationAssemblies"> <ItemGroup> <ReferencePath Include="@(_FilterOutFromReferencePath)" /> </ItemGroup> <Message Importance="normal" Text="Adding back DesignTimeFacades from ReferencePath now that SGen has ran." /> </Target> Another option (machine wide) is to add the following binding redirect to sgen.exe.config: <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.IO.Compression.ZipFile" publicKeyToken="b77a5c561934e089" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> This will only work on machines with .NET Framework 4.7.1. installed. Once .NET Framework 4.7.2 is installed on that machine, this workaround should be removed.