c# - System.Net.Http 缺少程序集、.NET 4.7.2 和 SharePoint CSOM
问题描述
我目前正面临“ System.Net.Http ”程序集的问题,这让我非常头疼。
在继续之前,我在网上搜索了几个小时,阅读并尝试了几篇文章中提到的解决方案,如下所示:
- 未找到 System.Net.Http 4.2.0.0 的奇怪问题
- https://github.com/dotnet/runtime/issues/26131
- 无法在 IIS 上加载文件或程序集“System.Net.Http,版本=4.2.0.0,文化=中性”
- 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
- 无法加载文件或程序集“System.Net.Http”
- https://www.reddit.com/r/csharp/comments/99zuzs/systemnethttp_is_driving_me_insane/
- 无法加载文件或程序集“System.Net.Http,版本=4.0.0.0,文化=中性,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.<GetADFSUserNameMixedAuthenticatedContext>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
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.1.1.3" />
// 2
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
// 3
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" />
// 4
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
在“ .csproj ”文件中,还有以下几行:
<Reference Include="System.Net" />
<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>
我试图玩弄那些,但没有更多的成功。
我还尝试通过包管理器删除“ 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包。我注意到的是,在“ References ”下,“ System.Net.Http ”的路径针对我的本地“ Program Files ”,而我的“ csproj ”文件中有以下几行:
<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>
我有另一个“旧”项目,以具有几乎相同依赖项的.NET Framework 4.6.1为目标,在这个项目中,为“ System.Net.Http ”设置的路径以我项目的“ packages ”文件夹为目标。
在我当前的项目中,每次我尝试更改“ System.Net.Http ”的引用路径并从我的“ packages ”目录中选择 DLL 时,它都会将路径设置为“ Program Files ”。
我还尝试在另一台机器上构建和运行项目,结果相同。
我很困惑...
编辑 2
我决定复制我的整个解决方案,然后我清理了每个项目并让它们以.NET Framework 4.6.1为目标。现在,我似乎摆脱了这个错误。有人有解释吗?
解决方案 - 解决方法
经过多次测试,我确认整个解决方案回到.NET Framework 4.6.1似乎可行。我的所有项目都编译,单元测试工作,我可以在我的代码中使用SharePoint 2019 CSOM和SharePoint PnP Core,而不会出现任何错误。
这可能不是一个好的解决方案,但就我而言,这是可以接受的。
解决方案
看看这个github repo。几年前我不得不使用 SharePoint CSOM 和 .NET Core,我也遇到过类似的问题。请注意,代码使用 .NET Core 而不是 .NET Framework。希望它会有所帮助。
推荐阅读
- python - 如何在 SQLAlchemy 中使用 BETWEEN 子句
- postgresql - 无论如何在 GORM 中预览将在迁移期间运行的模式 DDL,然后再运行它?
- go - 为什么导入“k8s.io/client-go/kubernetes/fake”时编译失败
- python - Pandas 数据帧初始化性能
- ruby-on-rails - 如何从 Rails 应用程序执行 curl
- javascript - Javascript 模拟时钟时针不工作,而其他指针工作
- git - 我们可以在没有使用 Git 的 pull/checkout/fetch 的情况下跟踪远程引用吗?
- node.js - 如果我有前端和后端的单独文件夹,如何部署 MEAN 应用程序?
- mysql - mysql错误用户'root'@'localhost'的访问被拒绝
- np - 需要帮助来理解通过从哈密顿路径减少来证明最长路径问题是 NP 完全的