Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用X509进行WCF安全性是否天生就很慢,每个请求都有一个新通道?_C#_.net_Wcf_X509certificate - Fatal编程技术网

C# 使用X509进行WCF安全性是否天生就很慢,每个请求都有一个新通道?

C# 使用X509进行WCF安全性是否天生就很慢,每个请求都有一个新通道?,c#,.net,wcf,x509certificate,C#,.net,Wcf,X509certificate,我是否可以做些什么来提高X509的性能并遵循新的通道每个请求最佳实践,或者这种缓慢的协商是使用X509实现WCF安全性的固有缺点 tl;dr skip在结尾处更新3以了解此问题的来源。 WCF频道的最佳实践似乎是“重用ChannelFactory,但为每个请求创建一个新频道”,我一直都是这样做的。例如 我目前正在尝试使用X509证书作为安全凭据,CreateChannel每次都需要花费时间(15秒以上)。重用通道随后会产生良好的性能(如果我理解正确,因为对称密钥是在调用CreateChannel

我是否可以做些什么来提高X509的性能并遵循新的通道每个请求最佳实践,或者这种缓慢的协商是使用X509实现WCF安全性的固有缺点

tl;dr skip在结尾处更新3以了解此问题的来源。

WCF频道的最佳实践似乎是“重用ChannelFactory,但为每个请求创建一个新频道”,我一直都是这样做的。例如

我目前正在尝试使用X509证书作为安全凭据,CreateChannel每次都需要花费时间(15秒以上)。重用通道随后会产生良好的性能(如果我理解正确,因为对称密钥是在调用CreateChannel时发生的初始公钥/私钥身份验证之后使用的),但这是一种糟糕的做法

在服务器端:

var managerCertificate = new X509Certificate2(@"Manager.pfx", "");
var host = new ServiceHost(typeof(ManagerService));
host.Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
host.Credentials.ClientCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;
host.Credentials.ServiceCertificate.Certificate = managerCertificate;
host.Open();
Console.ReadLine();
在工作端(减缓每个请求):

250ms的每次呼叫开销并不太可怕(尽管与重复使用信道相比是巨大的),但它似乎是时断时续(见17秒),频率不同,有时是三分之一。如果服务器在客户端exe运行之间保持不动,那么初始协商成本在后续运行中就会消失,所以这很好

更新2:可能与防火墙/防病毒无关,因为我在一个禁用了股票XP和防火墙的虚拟机中尝试了这一点,得到了非常不一致的结果。一次是可预测的(每次通话400毫秒),另一次是疯狂的停顿

更新3:浏览跟踪日志后,每次创建新频道时,服务器的耗时活动(以及导致偶尔暂停的活动)如下所示:


0
3.
0
255
我的计算机
"


所以,如果有人知道为什么这可能会持续暂停17.5秒,以及它是否总是正常花费250毫秒,那么你将回答我的问题

根据您使用的自签名证书的注释

WCF和自签名证书存在已知的性能问题,请参阅:


当您使用来自证书颁发机构的证书时,这不是问题。

我也看到过,但这并不真正适用于netTcpBinding。基于证书的安全性不会导致此延迟。问题一定在别处,很可能是网络级别的问题或检查证书有效性的问题。这些问题是从文件系统加载的自证书,并且CertificateValidationMode设置为none,因此我不确定这是否排除了证书有效性检查的原因。我将在一些不同的机器上尝试。如果有人对更新3有想法,需要更多信息,请直接询问。相关MS问题没有答案:链接中的一个重要提示。使用MakeCert制作的CA有效,您不需要适当的证书颁发机构设置来获得性能优势。关于您在其他帖子中引用的声称自签名证书存在性能问题的链接:它们根本没有提供任何证据来支持该声明,因此我不确定这是否被视为“已知问题”,除非您有其他相关信息。无论如何,我尝试了一些“正确”的证书,但遇到了相同的峰值。
var workerCertificate = new X509Certificate2(@"Worker.pfx", "");
var cfact = new ChannelFactory<IManagerService>("client");
cfact.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
cfact.Credentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.NoCheck;
cfact.Credentials.ClientCertificate.Certificate = workerCertificate;
for (int i = 0; i < 10; i++)
{
    using (IManagerService channel = cfact.CreateChannel()
    {
         Console.WriteLine(channel.GetMyData("test data" + i));
    }
}
0: 546.875ms
1: 281.25ms
2: 281.25ms
3: 17484.375ms
4: 250ms
5: 234.375ms
6: 250ms
7: 250ms
8: 265.625ms
9: 250ms
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
  <System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
    <EventID>0</EventID>
    <Type>3</Type>
    <SubType Name="Transfer">0</SubType>
    <Level>255</Level>
    <TimeCreated SystemTime="2012-03-10T15:02:27.2968750Z" />
    <Source Name="System.ServiceModel" />
    <Correlation ActivityID="{9e5e819b-e837-40b8-81b1-9f3c18e54595}" RelatedActivityID="{2faaac57-4e24-41ad-a3e5-85d81bddfa3b}" />
    <Execution ProcessName="WcfCertExample" ProcessID="420" ThreadID="4" />
    <Channel />
    <Computer>MYCOMPUTER</Computer>
  </System>
  <ApplicationData></ApplicationData>
</E2ETraceEvent>