小编Pau*_*ell的帖子

C#:将对象渲染为XML

我正在寻找一种将对象树转换为XML的方法.写作会很有趣,但我相信有人已经写过了.这是我的愿望清单:

  • 它不应该关心构造函数
  • 它理想情况下应该处理循环引用(不太f)
  • 它不应该要求更改对象 - 例如,没有自定义属性
  • 它不应该关心或需要已知的类型(例如,XmlInclude)
  • XML应该简单易懂 - 操作团队成员需要人类可读
  • 如果属性无法序列化,则应该只是抑制错误并继续
  • 可以处理列表和词典

我不需要重建对象模型,因此只写解决方案很好(可能是预期的).

我认为折扣:

  • XmlSerializer - 需要无参数构造函数,没有循环引用支持
  • DataContractSerializer - 需要属性(选择加入)

c# xml serialization

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

通过.NET实现文件数字签名的标准化方法

我正在构建一个用于分发由不同组织创建的包(.zip档案)的系统.我想要一种方法来验证包的发布者确实是他们声称的那个,并且该文件没有被篡改.

要验证发布者,需要一个类似于Web浏览器使用的系统 - 例如,我的应用程序联系验证身份的根证书颁发机构.换句话说,'绿色酒吧':)

我猜测包的创建会像这样工作:

  1. 作者创建了zip包
  2. 作者哈希包并签署哈希
  3. 它被重新包装,包括:
    • 包含签名哈希和公共证书的标头
    • 包含zip文件内容的正文

打开包的方式如下:

  1. 拿走数据的主体
  2. 使用相同的算法对其进行哈希处理
  3. 使用证书中的公钥解密程序包的哈希值
  4. 比较两个哈希 - 我们现在有完整性
  5. 联系根CA以验证身份

这样,我已经验证了身份,并且还验证了内容(内容本身不需要加密 - 目标是验证,而不是隐私).

所以我的问题是:

  1. 以上是接近它的正确方法吗?
  2. 人们通常使用什么哈希算法?我认为它应该是单向的.您是否只选择一个(MD5,SHA1,SHA2?)或支持多种更常见,让包工作者告诉您他们使用了哪一个(例如,文档的标题包含散列函数的名称).
  3. 你如何使用根CA?这是X509Store类的工作,还是涉及其他步骤?
  4. 这里涉及哪种证书?用于签署.NET程序集的相同类型的证书?(代码签名证书?)

最后,如果组织没有付费证书而是决定使用自行颁发的证书,我认为我仍然可以验证哈希值(为了数据完整性),而无需在计算机的证书库中安装内容或任何类似的魔法(在这些情况下,我只是显示:"由XYZ公司出版(未经证实)".这是正确的吗?

我已经找到了很多关于如何使用X509和RSACryptoServiceProvider的链接,所以我可能想出代码,我想我对这个过程更感兴趣并且知道我正在使用正确的技术.

.net digital-certificate

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

您是否应该在.NET中请求锁定超时?

发布它!迈克尔·尼加德(Michael Nygard)认为,许多灾难性的系统故障往往是由一连串的事情造成的.例如,两个线程死锁.现在线程池中的线程少了两个,因此其他线程上的负载增加会增加死锁可能性.突然,服务器根本没有响应,因为线程池耗尽,导致负载均衡器将流量转移到其他服务器(所有服务器都运行相同的代码),这增加死锁可能性.突然整个农场都处于脱机状态.

大多数RDBMS服务器检测到死锁并决定"失败者"(一个事务中止,另一个事务可以继续).相反,在C#中,lock语句将无限期地等待获取锁.

但是,您可以调用Monitor.TryEnter(lockObject,TimeSpan)来请求锁定或超时.如果超时到期并且无法获取锁定,则返回false.有些人在使用语句中将其包装起来以保持良好的语法.

所以我的问题是,你是否总是使用超时获取锁定?除了死锁情况外,超时会产生哪些问题?

.net multithreading scalability

5
推荐指数
1
解决办法
525
查看次数

Entity Framework连接字符串可以重用现有的连接字符串吗?

在我的配置文件中,我有一个应用程序的遗留部分使用的连接字符串(使用数据集)和实体框架的另一个字符串:

<connectionStrings>
    <add name="Database" connectionString="Server=..." />
    <add name="Entities" connectionString="metadata=.....connection string='Server=..." />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

这意味着服务器名称,数据库名称等被指定两次.我想告诉EF连接字符串重用第一个字符串 - 这可能吗?

.net ado.net entity-framework

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

获取对象的活动引用

我正在寻找一个托管/非托管API,它将允许我找到哪些对象引用另一个对象,并可能防止它被垃圾收集.

这样的API可能如下所示:

var foo = new Foo();
var bar = new Bar();
bar.Foo = foo;

var references = GC.GetReferencesTo(foo);
// references is an array that contains bar
Run Code Online (Sandbox Code Playgroud)

我知道可以使用分析器,但我想将它作为单元测试的一部分.我可以使用托管或非托管API吗?

.net c# garbage-collection

5
推荐指数
1
解决办法
7865
查看次数

耙任务订购

假设我有两个顶级任务:

task :publicBuild => [:zipSourceCode, :copyPrivateKey]
task :internalBuild => [:copyPrivateKey]
Run Code Online (Sandbox Code Playgroud)

对于internalBuild任务,我不想压缩源代码 - 我只想要私钥.但对于a publicBuild,我想做两件事.但我需要保证publicBuild,在zipSourceCode任务之前执行copyPrivateKey任务(我不希望源代码ZIP包含公钥).

一个依赖,如copyPrivateKey => zipSourceCode不会起作用,因为它意味着internalBuild,它会调用zipSourceCode,我不想要.

我想告诉rake的是"如果要执行这两个任务,你应该首先执行此操作,但它们都是可选的".这可能吗?

ruby rake

5
推荐指数
1
解决办法
1723
查看次数

在Unity中使用LogManager.GetLogger

鉴于此类:

class Foo
{
    readonly ILog log;

    public Foo(ILog log)
    {
        this.log = log;
    } 

    ...
}
Run Code Online (Sandbox Code Playgroud)

我想配置Unity注入ILog.这很简单:

container.RegisterInstance<ILog>(LogManager.GetLogger(typeof(XYZ)));
Run Code Online (Sandbox Code Playgroud)

但是我想LogManager.GetLogger用正在解析的父类型的类型进行Unity调用.

这很接近:

container.RegisterType<ILog>(new InjectionFactory((c, t, s) => LogManager.GetLogger(t)));
Run Code Online (Sandbox Code Playgroud)

t在这种情况下,类型是resolve(ILog),而不是为(Foo)解析对象的类型.

我知道我可以这样做:

container.RegisterType<Foo>(new InjectionFactory(c => new Foo(LogManager.GetLogger(typeof(Foo)));
Run Code Online (Sandbox Code Playgroud)

但是我不希望每次注册对象时都要添加那个疯狂的声明.

我知道这可以在Autofac中完成,我知道真正的答案不是首先使用Unity,但这可以做到吗?:)

log4net unity-container

5
推荐指数
1
解决办法
4663
查看次数

使用Visual Studio/ReSharper跟踪TDD时,如何在正确的位置快速创建类?

假设我正在关注TDD并使用VS/ReSharper.我开始写这样的测试:

[TestFixture]
class FooFixture
{
    [Test]
    public void ShouldDoSomething()
    {
        var foo = new Foo();
    } 
}
Run Code Online (Sandbox Code Playgroud)

此时,Foo不存在.ReSharper建议创建类的选项,但它将它放在我的测试项目的测试类旁边,而不是在我的实际项目中.所以我让它创建类,然后将其移动到一个新文件,然后将文件移动到正确的位置,最后修复命名空间.这似乎很多工作.

有没有更快捷的方法来快速创建Foo课程并将其放在正确的位置?似乎可以从我的测试项目的命名空间中猜出"正确的位置".

tdd resharper refactoring visual-studio

5
推荐指数
1
解决办法
181
查看次数

从TFS迁移到VSS

我安装了Team Foundation Server,并在一年前从VSS迁移了我的代码.这是一个很大的错误.在工作区,只读标志,解决方案绑定和错误的合并工具之间,我想我应该坚持使用VSS.

那么,我如何从TFS迁移回VSS?

tfs visual-sourcesafe

4
推荐指数
2
解决办法
1311
查看次数

为什么多次调用X509Certificate2.Export(Pkcs12)会返回不同的结果?

这是一个测试:

var decoded = Convert.FromBase64String(certificateBase64Encoded);
var certificate = new X509Certificate2(decoded, (string)null, X509KeyStorageFlags.Exportable);

var x = Convert.ToBase64String(certificate.Export(X509ContentType.Pkcs12));
var y = Convert.ToBase64String(certificate.Export(X509ContentType.Pkcs12));

Console.WriteLine(x == y);
Run Code Online (Sandbox Code Playgroud)

使用时X509ContentType.Cert,值始终相同,因此控制台打印"True".但是当使用Pkcs12选项时,值总是完全不同.为什么会这样,有没有办法使它们一样?

security cryptography certificate x509certificate2 x509certificate

3
推荐指数
1
解决办法
442
查看次数

MbUnit - 在TestFixtureTearDown中获得测试失败/成功结果

我正在使用MbUnit进行一些集成测试.在TestFixtureSetUp中,我创建了一个新的数据库实例(使用GUID作为数据库名称).在拆除中,我删除它.

但是,如果测试失败,我想保持数据库存活(所以我可以调查).有没有办法告诉我的TestFixtureTearDown测试是通过还是失败?

在代码中它看起来像:

[TestFixtureTearDown]
public void Stop()
{
    if (/* All tests passed */)
    {
       Database.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

mbunit

2
推荐指数
1
解决办法
821
查看次数

在ASP.NET MVC网站上构建API

我有一个现有的ASP.NET MVC网站,其行为如下:

public ActionResult Show(int id)
{
    var customer = GetCustomer(id);

    return View(new ShowCustomerModel(customer));
}
Run Code Online (Sandbox Code Playgroud)

我现在需要能够将这些操作作为API的一部分执行,该API将从第三方应用程序调用.理想情况下,操作看起来像:

public ActionResult Get(int id)
{
    var customer = GetCustomer(id);

    return Json(new CustomerResource(customer));
}
Run Code Online (Sandbox Code Playgroud)

问题是,存在哪些ASP.NET MVC工具或模式允许我将它们组合在一起 - 例如,Rails允许我指定多种返回格式:

def index
  @customer = get_customer(...)

  respond_to do |format|
    format.html # index.html.erb
    format.xml  { render :xml => @customer}
    format.json { render :json => @customer}
  end
end
Run Code Online (Sandbox Code Playgroud)

这甚至是一个很好的模式吗?我应该只是:

public Customer Get(int id)
{
    return GetCustomer(id);
}
Run Code Online (Sandbox Code Playgroud)

并使用动作过滤器有选择地呈现为JSON或视图?

asp.net api rest asp.net-mvc

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