ASP.NET Core中的目录服务和帐户管理问题
我有一个ASP.NET核心API项目,我想利用DirectoryServices和DirectoryServices.AccountManagement命名空间。
经过一些研究,我认为我找到了一些可行的project.json引用:
{ "version": "1.0.0-*", "compilationOptions": { "emitEntryPoint": true }, "dependencies": { "EntityFramework.Commands": "7.0.0-rc1-final", "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final", "EntityFramework.MicrosoftSqlServer.Design": "7.0.0-rc1-final", "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final", "Microsoft.AspNet.Mvc": "6.0.0-rc1-final", "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final", "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final", "Microsoft.Extensions.Configuration.FileProviderExtensions": "1.0.0-rc1-final", "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final", "Microsoft.Extensions.Logging": "1.0.0-rc1-final", "Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final", "Microsoft.Extensions.Logging.Debug": "1.0.0-rc1-final" }, "commands": { "web": "Microsoft.AspNet.Server.Kestrel", "ef": "EntityFramework.Commands" }, "frameworks": { "dnx451": { "frameworkAssemblies": { "System.DirectoryServices": "4.0.0.0", "System.DirectoryServices.AccountManagement": "4.0.0.0" } }, "dnxcore50": { }, "net451": { } }, "exclude": [ "wwwroot", "node_modules" ], "publishExclude": [ "**.user", "**.vspscc" ] }
添加后,使用这些引用中的类的代码建议将名称空间添加到类中:
using System.DirectoryServices; using System.DirectoryServices.AccountManagement;
之后intellisense没有抱怨并且一切看起来都很完美,但是如果我尝试构建或运行项目,我会得到“类型或命名空间名称’DirectoryServices’在名称空间’System’中不存在”错误。
是否有资源可以帮助我弄清楚如何在ASP.Net 5中实现DirectoryServices和DirectoryServices.AccountManagement?
作为旁注,我喜欢ASP.NET Core,但似乎必须手动创建引用的json文件,这是在MVC 5中添加引用的一大步,您只需要找到它们并选中添加它们的框。 让我想知道是否有一些我缺少的可以为你生成该文件的东西,而不是需要知道确切的字符并将它们粘贴在自己身上以使其工作。
在ASP.NET Core中(ASP.NET 5的新名称和vNext几个月未正式使用),默认情况下,项目将以多个平台为目标。
您已添加对dnx451
框架名字对象的引用,该对象以完整的.NET 4.5 Framework为目标。
现在,如果你使用
using System.DirectoryServices; using System.DirectoryServices.AccountManagement;
在* .cs文件中,它适用于.NET 4.5,但.NET Core失败,因为.NET Core没有引用此命名空间/程序集。 在构建时,将始终编译两个版本,这就是您收到此错误的原因。
您没有在Visual Studio编辑器中看到它,因为它显示了.NET 4.5的代码(在代码窗口上方是一个下拉菜单,您可以在其中切换目标框架)。
话虽这么说,你有两个选择:
-
您希望仅定位.NET 4.5
在这种情况下,您只需从project.json文件的frameworks部分删除
dnxcore50
名字对象(net451
也是如此,因为它仅适用于类库)。 这将使您的项目成为一个ASP.NET Core项目,该项目仅针对完整的.NET 4.5。 -
您希望/需要将.NET Core作为目标,而不是使用完整的.NET 4.5 Framework
这有点困难。 您需要替换.NET Core中的同一个库。 如果它使用相同的命名空间,只需将其引用添加到
dnxcore50
名字对象,你就可以了。如果没有直接替换,则必须使用预处理程序指令从.NET Core项目中删除此代码部分。
#if DNX451 using System.DirectoryServices; using System.DirectoryServices.AccountManagement; #endif
现在,您的命名空间将仅用于.NET 4.5目标,而不能用于.NET Core目标。
旁注:您可以删除net451
名字对象,因为它仅用于类库(包),这是.NET Core库的新项目类型,它编译成一个针对多个框架目标的包。 有关更多信息,请参阅RC1 公告 。
对于应用程序(ASP.NET Core Web Project或xUnit项目),始终使用应用程序名字对象(分别为dnx451
和dnxcore50
)。 对于类库,它是net451
和dotnet5.x
。
对于@Tseng的问题,我想补充一点,目标服务计划用于.NET Core 1.2。 以下是GitHub上的function请求: https : //github.com/dotnet/corefx/issues/2089 。 您可以在那里订阅并在发生某些事情时收到通知!
当它发布时,您可以在.NET Core中使用ASP.NET Core中的目录服务! 考虑到.NET Core的当前状态和版本,可能需要一些时间。
Microsoft已在asp.net core 2.0中发布了System.DirectoryServices的预发布版本。 您可以使用以下命令从nuget包管理器获取它:
Install-Package System.DirectoryServices -Version 4.5.0-preview1-25914-04
到目前为止,这对我来说还不错。