小编Aar*_*ght的帖子

导出X.509证书没有私钥

我认为这很简单,但显然不是.我安装了一个具有私钥,可导出的证书,我想以编程方式仅使用公钥导出它.换句话说,我想要一个等效于在通过certmgr导出并导出到.CER时选择"不导出私钥"的结果.

似乎所有X509Certificate2.Export方法都会导出私钥(如果它存在),如PKCS#12,这与我想要的相反.

有没有办法使用C#来实现这一目标,还是我需要开始深入了解CAPICOM?

.net c# ssl-certificate x509certificate2

11
推荐指数
2
解决办法
2万
查看次数

发信号并立即关闭ManualResetEvent是否安全?

我觉得我应该知道答案,但无论如何我都会问,以防万一我犯了一个潜在的灾难性错误.

以下代码按预期执行,没有错误/异常:

static void Main(string[] args)
{
    ManualResetEvent flag = new ManualResetEvent(false);
    ThreadPool.QueueUserWorkItem(s =>
    {
        flag.WaitOne();
        Console.WriteLine("Work Item 1 Executed");
    });
    ThreadPool.QueueUserWorkItem(s =>
    {
        flag.WaitOne();
        Console.WriteLine("Work Item 2 Executed");
    });
    Thread.Sleep(1000);
    flag.Set();
    flag.Close();
    Console.WriteLine("Finished");
}
Run Code Online (Sandbox Code Playgroud)

当然,正如多线程代码的情况一样,成功的测试并不能证明这实际上是线程安全的.如果我Close之前提出的话,测试也会成功Set,即使文档明确指出在a之后尝试做任何事情Close都会导致未定义的行为.

我的问题是,当我调用该ManualResetEvent.Set方法时,是否保证在将控制权返回给调用者之前发出所有等待线程的信号?换句话说,假设我能够保证不会再进一步​​调用,在这里关闭句柄是否安全,或者在某些情况下这个代码可能会阻止一些服务员发出信号或导致一个?WaitOneObjectDisposedException

该文档仅表示Set将其置于"信号状态" - 它似乎没有任何关于服务员何时会获得该信号的声明,所以我想确定.

.net multithreading manualresetevent

11
推荐指数
2
解决办法
3209
查看次数

触发器与非规范化存储过程的优缺点

当涉及在事务数据库中对数据进行非规范化以提高性能时,存在(至少)三种不同的方法:

  1. 通过存储过程推送更新,存储过程更新规范化的事务数据和非规范化的报告/分析数据;

  2. 在更新辅助表的事务表上实现触发器; 这几乎总是维持历史时所采取的路线;

  3. 将处理推迟到夜间批处理过程,可能将ETL放入数据集市/仓库.

让我们假设为了这个问题的目的,选项#3是不可行的,因为域要求非规范化数据始终与规范化数据一致.我经常处理的分层聚合就是其中的一个例子.

我已经使用了前两种方法中的两种方法,最近我一直倾向于基于触发器的方法,但我想知道是否有任何"陷阱"我尚未发现,并认为它值得问这个问题所以我在将来作出长期决定时会记住一些想法.

那么根据您的经验,这两种工具的优缺点是什么,以保持实时非规范化数据的特定目的?在什么情况下你会选择一个而不是另一个,为什么?

(PS请不要回答"触发器过于复杂"或"所有更新应始终通过存储过程" - 使其适合问题的上下文.)

database triggers stored-procedures denormalization sql-server-2008

10
推荐指数
2
解决办法
2万
查看次数

基于回合制的多人游戏:WCF还是Socket?

我想就我的问题提出建议.

我们正在创建一个具有以下功能的多人互联网国际象棋游戏:

  1. 游戏将支持非常大量的并发用户
  2. 我们将保存每个游戏在磁盘上的物理移动(例如使用SQL Server数据库)
  3. 我们也将使用相同的SQL Server for Sessions
  4. 多个游戏服务器将用于负载平衡/可扩展性
  5. 所有游戏服务器都将相互连接
  6. 所有游戏服务器也将连接到该SQL Server
  7. 由于这是国际象棋游戏,因此只有2个用户可以玩游戏
  8. 无限数量的用户可以作为受众(广播)实时查看此游戏
  9. 观众/游戏用户可以选择私下或公开发送和接收聊天消息.
  10. 我们将在数据库中维护自己的用户列表.因此,我们需要一个自定义身份验证系统.

客户端将是桌面Windows窗体/ wpf应用程序.我们也在考虑基于在线浏览器的版本,但我们已将其用于未来,目前我们专注于桌面版.

现在我的问题是?

  1. 我们应该使用哪种技术,套接字或WCF?
  2. 序列化,XML或二进制或自定义二进制文件的首选方法是什么?

任何其他建议/建议/方向也欢迎.

谢谢

.net sockets architecture wcf

10
推荐指数
1
解决办法
2046
查看次数

脚本/样式表:在本地合并或使用CDN?

我显然可以对自己进行一些有限的测试,但我希望能听到一些至少在中等规模网站上拥有实际经验的人.

每个"前10名"列表中用于优化站点/带宽的两个项目是:

  • 将尽可能多的JS和CSS整合到一个文件中(以减少往返次数); 和
  • 使用内容分发网络(以节省带宽/加快下载速度).

现在,您可以在Google或Microsoft的CDN(或两者)上找到几乎所有重要的脚本.你甚至可以找到一些非常重量级的项目,如jQuery ThemeRoller包.在Amazon S3等私人CDN帐户上使用这些CDN的主要优点之一是许多访问者已经从其他网站缓存了这些脚本.即使他们不这样做,也很难击败像谷歌这样的网站.

因此,假设我想使用这些公共CDN,而不是为个人CDN帐户支付额外费用以获得更好或更差或相同的性能.而且我们还说我正在使用这些公共CDN上的一堆JS/CSS文件:jQuery,jquery-ui,一个主题,jQuery TOOLS,以及其他一些.除了那些我可能正在使用公共CDN上没有的几个脚本,如superfish和jquery.approach和hoverIntent.很常见的东西.看来我有两个相互排斥的选择:

  • 有关上面列出的脚本,请参阅公共CDN.优点是我可以使用其他人的带宽并利用其中一些脚本的普及.缺点是客户端必须为所有这些文件进行不少于7次往返(4个单独的JS,1个CSS,以及1个用于整合/缩小本地内容的CSS和JS).要么...
  • 把所有东西塞进两个单片缩小的文件(一个用于JS,一个用于CSS),并提供我自己的Web服务器上的所有内容.优点是只有两次往返(至少节省66%).缺点当然是,现在我现在要服务于多更大的量自己.

这似乎是一个艰难的选择,我认为真正理解哪个更好("更好"是客户端加载时间和整体用户体验的功能)的唯一方法是实际将它放在野外,看看会发生什么.

所以,之前有人必须做出这个选择,如果是这样,你选择了什么,为什么,以及结果如何?或者,如果有人试图在孤立的环境中解决测试任务,你是怎么做的,结果是什么?

PS这就是描述"网络应用程序"类型的网站 - 换句话说,不是非常媒体密集,但可能包含大量的样式和脚本,实际上占了页面大小的一大部分.因此,我认为这不仅仅是一项智力活动.

optimization web-applications cdn

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

如何使用SQL批量复制获取插入数据记录的标识

我有一个DataTable大约有100,000条记录的ADO.NET .在此表中有一列 xyID没有值,因为该列是IDENTITY在我的SQL Server数据库中自动生成的.

我需要为其他进程检索生成的ID.我正在寻找一种方法来批量复制DataTable到SQL Server数据库,并在相同的"步骤"内"填充"我DataTable生成的ID.

如何使用SqlBulkCopy类检索插入表中的记录的标识值?

database sql-server ado.net identity sqlbulkcopy

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

通用,编译时安全延迟加载方法的方法

假设我创建了一个如下所示的包装类:

public class Foo : IFoo
{
    private readonly IFoo innerFoo;

    public Foo(IFoo innerFoo)
    {
        this.innerFoo = innerFoo;
    }

    public int? Bar { get; set; }
    public int? Baz { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这里的想法是,innerFoo可能包装数据访问方法或同样昂贵的东西,我只希望它GetBar和GetBaz方法被调用一次.所以我想在它周围创建另一个包装器,它将保存第一次运行时获得的值.

当然,做到这一点很简单:

int IFoo.GetBar()
{
    if ((Bar == null) && (innerFoo != null))
        Bar = innerFoo.GetBar();
    return Bar ?? 0;
}

int IFoo.GetBaz()
{
    if ((Baz == null) && (innerFoo != null))
        Baz = innerFoo.GetBaz();
    return Baz ?? …
Run Code Online (Sandbox Code Playgroud)

c# generics lazy-loading

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

将延迟的IEnumerable <T>拆分为两个序列而不进行重新评估?

我有一个方法需要处理传入的命令序列,并根据结果的某些属性将结果拆分到不同的桶中.例如:

class Pets
{
    public IEnumerable<Cat> Cats { get; set; }
    public IEnumerable<Dog> Dogs { get; set; }
}

Pets GetPets(IEnumerable<PetRequest> requests) { ... }
Run Code Online (Sandbox Code Playgroud)

底层模型完全能够PetRequest一次处理整个元素序列,而且PetRequest大部分都是ID等通用信息,因此尝试在输入处拆分请求是没有意义的.但是提供者实际上并没有回馈Cat和Dog实例,只是一个通用的数据结构:

class PetProvider
{
    IEnumerable<PetData> GetPets(IEnumerable<PetRequest> requests)
    {
        return HandleAllRequests(requests);
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经命名了响应类型,PetData而不是Pet清楚地表明它不是超类Cat或Dog- 换句话说,转换为Cat或是Dog映射过程.另一件事要记住的是,HandleAllRequests价格昂贵,如数据库查询,所以我真的不想再说一遍,而且我宁愿避免使用缓存在内存中的结果ToArray()或类似的,因为可能有几千数百万的结果(我有很多宠物).

到目前为止,我已经能够把这个笨拙的黑客扔到一起:

Pets GetPets(IEnumerable<PetRequest> requests)
{
    var data = petProvider.GetPets(requests);
    var dataGroups …
Run Code Online (Sandbox Code Playgroud)

.net c# linq ienumerable iterator

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

生成一个非全球唯一的标识符

我发现了许多关于生成UID的不同问题,但据我所知,我的要求有点独特(ha).

总结一下:我需要生成一个非常短的ID,它是"本地"唯一的,但不必是"全局"或"普遍"唯一的.约束不仅仅基于美学或空间问题,而是由于这实际上被用作硬件标签,并且这受到硬件约束的约束.以下是规格:

硬要求

  • ID必须只包含十进制数字(基础数据是BCD);
  • ID的最大长度为12个字符(数字).
  • 必须离线生成- 数据库/ Web连接并不总是可用!

软要求

  • 我们希望它从日历年和/或月开始.因为这确实浪费了很多熵,我不介意妥协或完全废弃它(如果必要的话).
  • 从特定计算机生成的ID应该是顺序出现的.
  • 编号可能不会有机器排序-例如,它完全罚款机1吐出[123000,124000,125000],和机器2吐出[123500,123600,124100].
  • 然而,在集体意义上越顺序,越好.像[200912000001,200912000002,200912000003,...]这样的一组ID将是完美的,尽管这显然不能跨多台机器扩展.

使用场景:

  • 该方案范围内的ID最多可由10台,甚至100台不同的机器生成.
  • 生成的ID总数不会超过几百万.
  • 并发性极低.单个机器不会比每5分钟左右更频繁地生成ID.此外,一次最多不超过5台机器将在同一小时甚至同一天内生成ID.我希望在给定的机器上一天内生成的ID少于100个,所有机器的生成少于500个.
  • 少数机器(3-5)最有可能负责生成超过80%的ID.

我知道可以使用少于12个十进制数字将时间戳编码为100 ms甚至10 ms精度,这足以保证此应用程序的"足够唯一"ID.我在这里问这个问题的原因是因为我真的想要尝试在那里加入人类可读的年/月或编码关于源机器的一些信息,或两者兼而有之.

我希望有人可以帮助在这些软性要求上做出妥协......或者解释为什么在给出其他要求的情况下它们都不可能.

(PS我的"原生"语言是C#,但如果有人有任何好主意,任何语言或甚至伪代码的代码都可以.)

更新:

既然我已经有机会在它上面睡觉了,我想我实际上要做的是默认使用时间戳编码,并允许单个安装通过定义自己的2或者切换到机器顺序ID 3位机器ID.这样,想要弄乱ID并打包在人类可读信息中的客户可以找出他们自己确保唯一性的方法,我们对滥用不负责任.也许我们通过提供服务器实用程序来帮助处理机器ID,如果它们碰巧正在进行所有在线安装.

language-agnostic algorithm unique uniqueidentifier

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

高性能分层文本搜索

我现在正处于升级主要交易系统中层次结构设计的最后阶段,我一直在这150行查询中盯着看(我将免除你阅读的所有单调)并认为那里必须是一个更好的方式.

该问题的快速摘要如下:

您将如何实现与层次结构中不同级别的多个搜索项匹配的分层搜索,并针对最快的搜索时间进行优化?


我发现了一个有点相关的问题,但它实际上只有我实际需要的答案的20%左右.这是完整的场景/规范:

  • 最终目标是在层次结构中的任意位置找到一个或多个任意项.
  • 完整的层次结构大约有80,000个节点,预计在几年内会增长到1M.
  • 层次结构中整个路径的全文是唯一且具有描述性的; 但是,单个节点的文本可能不是.这是一个商业现实,而不是一个轻率的决定.
  • 示例:一个节点可能有一个像"门"这样的名字,这本身就没有意义,但完整的背景,"Aaron> House> Living Room> Liquor Cabinet> Door",具有明确的含义,它描述了一个具体的特定门地点.(请注意,这只是一个例子,真正的设计远没那么简单)
  • 为了找到这个特定的门,用户可能会输入"aaron酒门",这可能只会产生一个结果.查询被翻译为序列:包含文本"door"的项目,在包含文本"liquor"的项目下,在包含文本"aaron"的另一项下.
  • 或者,用户可能只需键入"家酒"就可以列出人们家里的所有酒柜(不会那么好).我明确提到这个例子,表明搜索不需要匹配任何特定的根或叶级别.这个用户确切地知道他正在寻找哪个门,但不记得是谁拥有它,并且会记住这个名字是否出现在他面前.
  • 所有术语必须按指定的顺序匹配,但正如上面的示例所示,层次结构中的级别可以"跳过".术语"阿龙酒内阁"将不会匹配这个节点.
  • 该平台是SQL Server 2008,但我认为这是一个独立于平台的问题,并且不希望限制该平台的答案.
  • 层次结构本身基于hierarchyid(物化路径),索引广度优先和深度优先.每个层次结构节点/记录都有一个Name要查询的列.基于节点的层次结构查询非常快,所以不要担心这些.
  • 没有严格的层次结构 - 根可能根本不包含任何节点,或者可能包含扇出到10,000个叶节点的30个子树.
  • 最大嵌套是任意的,但实际上它往往不超过4-8级.
  • 虽然不经常,但层次结构可以而且确实会发生变化.任何节点都可以移动到任何其他节点,但有明显的例外(父节点不能移动到自己的子节点等)
  • 如果还没有暗示:我确实可以控制设计,并可以添加索引,字段,表格,以及获得最佳结果所需的一切.

我的"梦想"是向用户提供即时反馈,如渐进式搜索/过滤器,但我知道这可能是不可能的或非常困难的.我对当前方法的任何重大改进感到满意,通常需要0.5s到1s,具体取决于结果的数量.

为了完整起见,现有查询(存储过程)首先收集包含最终项的所有叶节点,然后向上连接并排除其路径与先前项不匹配的任何路径.如果这对任何人来说都是落后的,那么请放心,它比从根源开始并散开更有效率.这是"旧的"方式,每次搜索可能需要几秒钟.

那么我的问题是: 是否有更好(更有效)的方式来执行此搜索?

我不一定在寻找代码,只是方法.我考虑了一些可能性,但它们似乎都有一些问题:

  • 创建一个分隔的"路径文本"列,并使用全文搜索对其进行索引.麻烦的是,对此列的搜索也将返回所有子节点; "aaron house"也与"aaron house kitchen"和"aaron house basement"相匹配.
  • 创建一个NamePath实际上是嵌套字符串序列的列,使用CLR类型,类似于hierarchyid它自己.问题是,我不知道微软如何能够将这种类型的查询"转换"为索引操作,我甚至不确定是否可以在UDT上进行.如果最终结果只是一个完整的索引扫描,我通过这种方法得不到任何结果.

如果我不能做得比现有的更好,那真的不是世界末日; …

database performance search database-design hierarchy

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