Xia*_*ofu 6 .net c# wcf x509certificate
我能做些什么来使X509表现更好并遵循新通道 - 每个请求的最佳实践,或者这种缓慢的协商是使用X509进行WCF安全的固有缺点?
对于tl; dr跳到最后的Update 3以获取此源.
使用WCF频道的最佳做法似乎是"重用ChannelFactory,但为每个请求创建一个新频道",我总是这样做.例如,单个WCF信道性能与多个信道
我目前正在尝试使用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();
Run Code Online (Sandbox Code Playgroud)
在工人方面(减慢每个请求):
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));
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在for循环之外移动CreateChannel调用以重用它,则只有第一个请求需要花费大量时间.
另外,我正在使用NetTcpBinding.
更新1:结果的简短示例:
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
Run Code Online (Sandbox Code Playgroud)
250ms对于每次呼叫来说并不是太可怕(虽然与重用频道相比是巨大的),但似乎在频率上有所变化(见17秒),有时是1比3.如果服务器在客户端exe的运行之间保持不变,则初始协商成本在后续运行时消失,因此这很好.
更新2:可能不是防火墙/防病毒相关,因为我在具有库存XP和防火墙禁用的虚拟机中尝试了这一点并且得到了非常不一致的结果.一次可预测(每次通话400ms),另一次是这些疯狂的停顿.
更新3:浏览跟踪日志后,每次创建新通道(以及导致偶尔暂停的活动)时,似乎耗费时间的服务器活动是:
<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>
Run Code Online (Sandbox Code Playgroud)
该日志还说:相关活动名称:流程操作' http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue '.
因此,如果有人对于为什么这可能会持续停留17.5秒以及它是否总是花费250毫秒通常会有任何想法,那么你将回答我的问题!
| 归档时间: |
|
| 查看次数: |
1974 次 |
| 最近记录: |