System.Net.Http缺失的程序集,.NET 4.7.2和SharePoint CSOM。
System.Net.Http缺失的程序集,.NET 4.7.2和SharePoint CSOM。
我目前正在遇到与“System.Net.Http”程序集相关的问题,这使我非常头疼。
在进一步之前,我在网上搜索了几个小时,阅读并尝试了几篇文章中提到的解决方案,例如以下文章:
- Strange issue with System.Net.Http 4.2.0.0 not found
- https://github.com/dotnet/runtime/issues/26131
- Could not load file or assembly \'System.Net.Http, Version=4.2.0.0, Culture=neutral on IIS
- https://github.com/Microsoft/dotnet/blob/master/releases/net472/KnownIssues/613745%20-%20Single-name%20references%20are%20removed%20by%20the%20SDK%20when%20targeting%204.7.2.md
- Could not load file or assembly \'System.Net.Http
- https://www.reddit.com/r/csharp/comments/99zuzs/systemnethttp_is_driving_me_insane/
- Could not load file or assembly \"System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\"
显然,我缺少了某些东西,因为我不能解决这个问题。
基本上,我有一个由多个项目组成的解决方案,所有项目都针对.NET Framework 4.7.2。其中一个是简单的控制台应用程序,其他是类库项目。其中一个包含对SharePoint CSOM和Office Dev PnP的引用。
然而,每次调用以下行时...
context.ExecuteQuery();
...我会得到以下错误:
Exception thrown: 'System.IO.FileNotFoundException' in mscorlib.dll Message "Could not load file or assembly 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified."
堆栈跟踪如下:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) at System.ServiceModel.Security.IWSTrustContract.Issue(Message message) at System.ServiceModel.Security.WSTrustChannel.Issue(RequestSecurityToken rst, RequestSecurityTokenResponse& rstr) at System.ServiceModel.Security.WSTrustChannel.Issue(RequestSecurityToken rst) at OfficeDevPnP.Core.IdentityModel.TokenProviders.ADFS.UsernameMixed.RequestToken(String userName, String passWord, Uri userNameMixed, String relyingPartyIdentifier) at OfficeDevPnP.Core.IdentityModel.TokenProviders.ADFS.UsernameMixed.GetFedAuthCookie(String siteUrl, String userName, String password, Uri userNameMixed, String relyingPartyIdentifier, Int32 logonTokenCacheExpirationWindow) at OfficeDevPnP.Core.AuthenticationManager.<>c__DisplayClass42_0.b__0(Object oSender, WebRequestEventArgs webRequestEventArgs) at Microsoft.SharePoint.Client.ClientRuntimeContext.OnExecutingWebRequest(WebRequestEventArgs args) at Microsoft.SharePoint.Client.ClientContext.GetWebRequestExecutor() at Microsoft.SharePoint.Client.ClientContext.GetFormDigestInfoPrivate() at Microsoft.SharePoint.Client.ClientContext.EnsureFormDigest() at Microsoft.SharePoint.Client.ClientContext.ExecuteQuery() at SP19ProvisioningAppDomain.Repository.WebRepository.ProvisionWeb(String template) in ... line 105
我使用NuGet安装了Microsoft.SharePoint.Client、OfficeDevPnP.Core和SharePointPnPCore2019。
起初,在“packages.config”文件中只有对“System.Net.Http”的引用。所以我在“app.config”文件中尝试了以下事情:
// 1 // 2 // 3 // 4
在“.csproj”文件中,还有以下行:
..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll True True
我尝试过与这些代码玩耍,但没有更多的成功。
我还尝试通过软件包管理器删除“System.Net.Http”,并通过“引用/框架”添加它,但由于我根本无法勾选复选框,卸载软件包引发了依赖项错误。我删除了“bin”和“packages”文件夹,卸载并重新安装软件包,消除NuGet缓存,重启了Visual Studio数千次,彻底搞乱了我的解决方案,进行了许多“NuGet restore”以回到起点。
说实话,我以前从未遇到过这个错误,有点困惑。我想不出我哪里出了问题。我可以补充一下,我正在使用Visual Studio Professional 2019,16.5.4。
有人有想法或能给我帮助吗?不胜感激。
最好的问候,
编辑1
根据Raju Joseph的答案,我尝试了以下几点:
- 卸载项目的所有NuGet软件包
- 删除\"bin\"和\"obj\"文件夹
- 清理\"app.config\"和\"packages.files\"
- 清理\"csproj\"文件
- 将所需的DLL复制到另一个文件夹,并手动将其添加为引用
不幸的是,它并没有更好地工作。
所以,我又清理了一次,重新安装了NuGet软件包。我注意到的是,在“引用”下,“System.Net.Http”的路径指向我的本地“Program Files”,而我在我的“csproj”文件中有以下几行:
..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll True True
我有另一个“旧”的项目,目标是.NET Framework 4.6.1,几乎有相同的依赖关系,在这个项目中,“System.Net.Http”的路径设置为我的项目的“package”文件夹。
在我的当前项目中,每次我尝试更改“System.Net.Http”的引用路径并从我的“packages”目录中选择DLL时,它都将路径设置到“Program Files”。
我还尝试在另一台机器上构建和运行该项目,结果相同。
我困惑了......
编辑2
我决定复制整个解决方案,然后清理每个项目,使它们针对.NET Framework 4.6.1。目前,似乎我已经摆脱了这个错误。有人有解释吗?
解决方案-解决办法
经过几次测试,我确认为整个解决方案回到.NET Framework 4.6.1似乎可行。所有我的项目都可以编译,单元测试也可以运行,并且我可以在我的代码中使用SharePoint 2019 CSOM和SharePoint PnP Core而不会出现任何错误。
这可能不是一个好的解决方案,但在我的情况下,这是可以接受的。