小编Hol*_*roe的帖子

UserPrincipal.GetGroups失败,未知错误

我正在尝试使用以下代码获取用户的所有Active Directory组:

    private static IEnumerable<string> GetGroupNames(string userName)
    {
        using (var context = new PrincipalContext(ContextType.Domain))
        {
            using (var userPrincipal = UserPrincipal.FindByIdentity(context, userName))
            {
                var groupSearch = userPrincipal.GetGroups(context);
                var result = new List<string>();
                foreach (var principal in groupSearch)
                {
                    Log.LogDebug("User {0} is member of group {0}", userPrincipal.DisplayName, principal.DisplayName);
                    result.Add(principal.SamAccountName);
                }
                return result;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

此代码正确查找用户主体,但在使用PrincipalOperationException调用GetGroups时失败:未知错误(0x80005000).

根异常:

   at System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOf(Principal foreignPrincipal, StoreCtx foreignContext)
   at System.DirectoryServices.AccountManagement.Principal.GetGroupsHelper(PrincipalContext contextToQuery)
   at System.DirectoryServices.AccountManagement.Principal.GetGroups(PrincipalContext contextToQuery)
   at [line of the GetGroup call]
Run Code Online (Sandbox Code Playgroud)

内部异常(COMException):

   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject() …
Run Code Online (Sandbox Code Playgroud)

.net directoryservices active-directory

19
推荐指数
1
解决办法
8598
查看次数

使用AutoFixture创建递归树

我刚刚开始使用AutoFixture并拥有这个半复杂的数据结构,我想创建一些标本.在我正在使用的测试中,我不太关心数据结构的内容.我只想要合理的默认值.

此数据结构的一部分是递归树.更具体地说,一个类包含一些其他类的集合,其中包含自身的子列表.类似于:

public class A
{
   private IEnumerable<B> bNodes;
   public A(IEnumerable<B> bNodes)
   {
      this.bNodes = bNodes;
   }
}

public class B
{
   private IEnumerable<B> children;
   public B(IEnumerable<B> children)
   {
      this.children = children;
   }
}
Run Code Online (Sandbox Code Playgroud)

让我们假设我出于各种原因无法轻易改变这种结构.

如果我要求我的灯具创建一个ThrowingRecursionBehavior将开始咆哮B是递归的.

如果我用OmitOnRecursionBehavior替换ThrowingRecursionBehavior,我会得到一个ObjectCreateException.

如果我尝试类似:fixture.Inject(Enumerable.Empty()); 我从DictionaryFiller中得到"已添加相同键的项目".如果我用NullRecursionBehavior替换ThrowingRecursionBehavior,也会发生同样的事情.

我想要几件事.

  • 用空的B列表创建A样本的最佳方法是什么?
  • 什么是最好的方法来创建一个A标本与一些Bs包含几个带有几个孩子的B孩子(一棵小树)?

对于我的遗愿,指定一些递归深度可能会很好,在此之后使用Enumerable.Empty(或零大小的数组/ List或甚至为null).我知道AutoFixture可以非常灵活地扩展.因此,我认为应该可以创建一些完全符合这一要求的样本构建器.事实上,我会尝试使用自定义的ISpecimenBuilder,但也许有人已经有了一个更智能的解决方案.例如,在RecursionGuard中修改此行是否有意义:

public object Create(object request, ISpecimenContext context)
{
   if (this.monitoredRequests.Any(x => this.comparer.Equals(x, request)))
   ...
Run Code Online (Sandbox Code Playgroud)

public object Create(object request, ISpecimenContext context)
{
   if (this.monitoredRequests.Count(x => this.comparer.Equals(x, request)) > maxAllowedRecursions)
   ...
Run Code Online (Sandbox Code Playgroud)

c# unit-testing autofixture

13
推荐指数
1
解决办法
3364
查看次数

大规模图像存储

我可能会参与一个项目,其中一个重要组件是大量文件的存储(在这种情况下是图像,但它应该只是作为文件存储).

传入文件的数量预计约为每周500,000(平均每个约100 Kb),每天大约100,000个文件,每秒5个.在达到平衡状态之前,文件总数预计将达到数千万,其中文件因输入速率的各种原因而过期.

所以我需要一个系统,可以在高峰时间每秒存储大约5个文件,同时读取大约4个文件并随时删除4个文件.

我最初的想法是,一个简单的NTFS文件系统,其中包含一个简单的存储,过期和读取服务应该足够了.我可以想象服务创建每年,每月,每天和每小时的子文件夹,以保持每个文件夹的文件数量最少,并允许手动过期以防需要.

这里讨论了一个大型的NTFS解决方案,但我仍然可以使用一些建议来解决在构建具有上述规范的存储时会遇到的问题,期望的维护问题以及存在哪些替代方案.优选地,如果可能且实用的话,我想避免分布式存储.

编辑

感谢所有的意见和建议.关于该项目的更多奖励信息:

这不是最终用户提供图像的Web应用程序.没有透露太多,因为这是在合同阶段,它更多的是质量控制类别.想想带有传送带和传感器的生产工厂.这不是传统的质量控制,因为产品的价值完全取决于图像和元数据数据库的顺利运行.

自治应用程序以先进先出的顺序访问图像99%,但也会发生用户应用程序的随机访问.超过一天的图像将主要用于存档目的,但这一目的也非常重要.

由于各种原因,图像的到期遵循复杂的规则,但在某些日期,应删除所有图像.删除规则遵循依赖于元数据和用户交互的业务逻辑.

每天都会有停机时间,可以进行维护.

优选地,文件存储器不必将图像位置传送回元数据服务器.如果选择某种散列或分布式系统,则可以通过映射数据库从元数据中唯一地扣除图像位置.

所以我的问题是:

  • 哪些技术可以做得很好?
  • 哪些技术的实施成本最低?
  • 客户的IT部门最容易维护哪些技术?
  • 这种规模的特定技术有哪些风险(5-20​​ TB数据,10-100万个文件)?

architecture ntfs

11
推荐指数
1
解决办法
4923
查看次数

我应该使用struct还是class?

我处在一个经典的设计困境中.我正在编写一个C#数据结构来包含一个值和测量单位元组(例如7.0毫米),我想知道我是否应该使用引用类型或值类型.

结构的好处应该是减少堆操作,从而使我在表达式中获得更好的性能并减少对垃圾收集器的压力.对于像这样的简单类型,这通常是我的选择,但在这个具体案例中存在缺点.

元组是相当通用的分析结果框架的一部分,其中结果在WPF应用程序中以不同方式呈现,具体取决于结果值的类型.WPF及其所有数据模板,值转换和模板选择器都可以很好地处理这种弱类型.这意味着如果我的元组表示为结构,则该值将经历大量装箱/拆箱.实际上,在表达式中使用元组对于在拳击场景中的使用来说将是次要的.为了避免所有的拳击,我考虑将我的类型声明为一个类.关于结构的另一个担心是在WPF中可能存在双向绑定的缺陷,因为在代码中的某处而不是引用副本更容易得到元组的副本.

我也有一些方便的运算符重载.我可以使用重载的比较运算符比较毫米和毫米毫米没有问题.但是我不喜欢重载==和!=的想法,如果我的元组是一个类,因为约定是==和!=是引用类型的ReferenceEquals(与System.String不同,这是另一个经典的讨论).如果==和!=重载,有人会写if(myValue == null)并在myValue有一天结果为null时得到一个讨厌的运行时异常.

另一个方面是在C#中没有明确的方法(与例如C++不同)在代码使用中区分引用和值类型,但语义是非常不同的.我担心我的元组的用户(如果声明了struct)假定该类型是一个类,因为大多数自定义数据结构都是并且假设是引用语义.这是另一个争论,为什么人们应该更喜欢类,因为那是用户所期望的,而且没有"." /" - >"告诉他们分开.一般来说,我几乎总是会使用一个类,除非我的探查器告诉我使用一个结构,只是因为类语义最有可能是其他程序员所期望的,而C#只有模糊的提示,无论它是一个还是另一个.

所以我的问题是:

在决定是否应该重视或参考时,我还应该考虑哪些其他因素?

可以== /!=在类中重载在任何情况下都是合理的吗?

程序员假设的东西.大多数人可能会认为称为"点"的东西是值类型.如果您阅读一些带有"UnitValue"的代码,您会假设什么?

根据我的使用说明你会选择什么?

c# boxing class-design

9
推荐指数
1
解决办法
1357
查看次数

在Entity Framework中优化LINQ Any()调用

在对基于Entity Framework 4.0的数据库层进行概要分析后,我发现主要的性能罪人是一个简单的LINQ Any(),用于检查数据库中是否已存在实体.Any()检查比保存实体的速度慢几个数量级.数据库中的行数相对较少,正在检查的列已编制索引.

我使用以下LINQ来检查是否存在设置组:

from sg in context.SettingGroups
where sg.Group.Equals(settingGroup) && sg.Category.Equals(settingCategory)
select sg).Any()
Run Code Online (Sandbox Code Playgroud)

这会生成以下SQL(另外我的SQL分析器声称查询执行了两次):

exec sp_executesql N'SELECT 
CASE WHEN ( EXISTS (SELECT 
    1 AS [C1]
    FROM [dbo].[SettingGroups] AS [Extent1]
    WHERE ([Extent1].[Group] = @p__linq__0) AND ([Extent1].[Category] = @p__linq__1)
)) THEN cast(1 as bit) WHEN ( NOT EXISTS (SELECT 
    1 AS [C1]
    FROM [dbo].[SettingGroups] AS [Extent2]
    WHERE ([Extent2].[Group] = @p__linq__0) AND ([Extent2].[Category] = @p__linq__1)
)) THEN cast(0 as bit) END AS [C1]
FROM  ( SELECT 1 AS X ) AS …
Run Code Online (Sandbox Code Playgroud)

linq performance entity-framework

8
推荐指数
1
解决办法
6926
查看次数

WPF中高效的实时日志查看器

我想在WPF中有一个高效的日志查看器控件,它只是在添加消息时显示实时日志.连接来自日志系统的通知没有问题,但是我担心一旦日志数量变大,日志窗口就会随着每个追加的日志行进行爬行.

日志通知事件将只提供一个日志字符串(以及一些元数据),我想要附加到TextBox中的行或带有滚动条的类似行.假设有足够的内存,附加大量的行不应该是内存问题,但我不希望一旦添加行号10,000,系统就会变慢.

我假设一旦字符串进入MB大小和数千行,将TextBox绑定到简单的字符串依赖属性将变得相当慢.

如何在WPF中有效地编写这样的控件?

wpf

8
推荐指数
1
解决办法
7989
查看次数

实体框架4中是否允许可以为空的外键?

我在更新Entity Framework实体中的外键时遇到问题.我正在使用自我跟踪实体并且具有一些具有某种关系的实体,其中外键也作为属性存在(EF4的新特征之一).密钥(整数)标记为Nullable并且修复了并发模式.

具体来说,我有一个与确认用户有很多到0..1关系的Alarm实体.(用户可以确认多个警报,但只能由零个或一个用户确认警报).

实体定义(简化):

Alarm properties
Id      Int32   non-nullable  identity entity key
UserId  Int32   nullable concurrency mode fixed
Alarm navigation properties
User    0..1 multiplicity

User properties
Id      Int32   non-nullable  identity entity key
Name    String  non-nullable
Run Code Online (Sandbox Code Playgroud)

在我的自我跟踪实体中,确认用户ID按预期自动生成为Nullable,但是如果我将用户分配给已经持久的警报并运行ApplyChanges,则自我跟踪上下文扩展会尝试设置原始值(null) EF上下文(在上下文扩展中的SetValue中),但是以静默方式跳过,因为EdmType的ClrEquivalentType是一个不可为空的Int32.

自动生成的扩展码:

    private static void SetValue(this OriginalValueRecord record, EdmProperty edmProperty, object value)
    {
        if (value == null)
        {
            Type entityClrType = ((PrimitiveType)edmProperty.TypeUsage.EdmType).ClrEquivalentType;
            if (entityClrType.IsValueType &&
                !(entityClrType.IsGenericType && typeof(Nullable<>) == entityClrType.GetGenericTypeDefinition()))
            {
                // Skip setting null original values on non-nullable CLR types because the ObjectStateEntry …
Run Code Online (Sandbox Code Playgroud)

entity-framework nullable optimistic-concurrency self-tracking-entities

7
推荐指数
1
解决办法
5815
查看次数

反序列化XML时忽略指定的编码

我试图通过套接字读取从外部接口收到的一些XML.问题是XML头中的编码指定错误(它表示iso-8859-1,但它是utf-16BE).据记载,编码是utf-16BE,但显然他们忘记设置正确的编码.

要在反序列化时忽略编码,我使用如下的StringReader:

    private static T DeserializeXmlData<T>(byte[] xmlData)
    {
        var xmlString = Encoding.BigEndianUnicode.GetString(xmlData);
        using (var reader = new StringReader(xmlString))
        {
            reader.ReadLine(); // Eat header line
            using (var xmlReader = XmlReader.Create(reader))
            {
                var serializer = new XmlSerializer(typeof(T));
                return (T)serializer.Deserialize(xmlReader);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

以上实际上工作正常,但我不喜欢通过调用ReadLine跳过标题行的部分.是否有一种不那么脆弱的方法来绕过XML标头中指定的编码?

使用StreamReader解决方案

通过使用StreamReader,我可以覆盖XML头中指定的编码.指定XmlReaderSettings.IgnoreProcessingInstructions与否没有任何区别.有趣的是,如果StreamReader找到unicode字节顺序标记,则忽略指定的编码.

回顾一下:

  • 如果使用TextReader初始化XmlReader,则忽略XML标头编码.
  • 如果使用StringReader,则如果存在unicode字节顺序标记,则XmlReader将失败.
  • 如果使用StreamReader,则unicode字节顺序标记将覆盖StreamReader编码.
  • 使用TextReader时,XmlReaderSettings.IgnoreProcessingInstructions = true没有区别.

总之,最强大的解决方案似乎是使用StreamReader,因为它使用字节顺序标记(如果存在).

    private static T DeserializeXmlData<T>(byte[] xmlData)
    {
        using (var xmlDataStream = new MemoryStream(xmlData))
        {
            using (var reader = new StreamReader(xmlDataStream, Encoding.BigEndianUnicode))
            {
                using (var xmlReader = XmlReader.Create(reader))
                {
                    var serializer …
Run Code Online (Sandbox Code Playgroud)

.net xml xmlserializer stringreader

7
推荐指数
1
解决办法
2946
查看次数

WCF DateTimeOffset兼容性

我有一个.NET WCF服务,其中包含一些采用DateTimeOffset的操作契约.这个想法是为了避免与夏令时和时区混淆.

但是我怀疑使用DateTimeOffset毕竟是一个好主意,因为它是相当非标准的,并且会对尝试连接的任何人造成麻烦,例如,Java应用程序或绑定到较旧.NET版本的.NET应用程序.

另一种方法是期望UTC DateTime,但这会带来某人忘记使用UTC时间并以本地时间调用服务的风险.我还可以期待当地时间DateTime,因为客户端将始终处于相同的时区,但这会在DST更改中留下一些微妙但经典的模糊性.

是否有人在服务界面中使用DateTimeOffset头痛故事,或者毕竟使用起来相对没有问题?

.net wcf web-services datetimeoffset

6
推荐指数
2
解决办法
4773
查看次数

FlowDocument表中的单行边框

我有一个FlowDocument表,我想稍微调整一下布局.我想的是一条细线,将发票上的子金额与标题Word2007表格样式中标题行标题行之间的行分隔开来.我希望我可以添加一个空的TableRow并将高度设置为几个像素单位,但我发现没有任何属性可以强制行的高度达到我的愿望.

有没有办法(或黑客)在System.Windows.Documents.Table中的整行下面或上面创建一条细边框线?

wpf flowdocument

5
推荐指数
2
解决办法
8696
查看次数