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的代码(在代码窗口上方是一个下拉菜单,您可以在其中切换目标框架)。

话虽这么说,你有两个选择:

  1. 您希望仅定位.NET 4.5

    在这种情况下,您只需从project.json文件的frameworks部分删除dnxcore50名字对象( net451也是如此,因为它仅适用于类库)。 这将使您的项目成为一个ASP.NET Core项目,该项目仅针对完整的.NET 4.5。

  2. 您希望/需要将.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项目),始终使用应用程序名字对象(分别为dnx451dnxcore50 )。 对于类库,它是net451dotnet5.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

到目前为止,这对我来说还不错。