Я разработал приложение клиент / сервер для моего текущего работодателя, и одно из требований заключается в том, чтобы клиентская часть распространялась в виде DLL. Поскольку DLL не 'делают' файлы dllName.dll.config, мне нужно переместить конфигурацию в код. Я сделал это в меру своих возможностей, но теперь я получаю это исключение;
Сбой сертификата X.509 CN = ComputerName.
Использованный сертификат имеет цепочку доверия, которая не может
быть проверенным. Замените сертификат или измените CertificateValidationMode.
Произошла внутренняя ошибка цепочки сертификатов.
Я гуглил и все время искал решение этой проблемы, но до сих пор не могу найти ничего с достаточно ясным объяснением различных близких, но не совсем решений, которые я видел.
В любом случае, в My LocalStore есть сертификат, но он действительно используется только сервером (в настоящее время тестирует и клиента, и сервер на одном и том же компьютере с XP Pro), по крайней мере, насколько я понимаю. (Все еще довольно плохо знаком с WCF) (Обратите внимание, что файл конфигурации клиента ниже не получает или иным образом не указывает вышеупомянутый сертификат клиенту.
Клиентский app.config выглядит следующим образом и прекрасно работает через наш тестовый EXE-файл, который содержит раздел этого конфигурационного файла.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="MyTcpBinding_IFileXferService"
receiveTimeout="02:00:00"
sendTimeout="02:00:00"
transferMode="Streamed"
maxBufferSize="65536"
maxReceivedMessageSize="2147483647">
<readerQuotas maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="65536" />
<security mode="Transport">
<transport clientCredentialType="None" />
</security>
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="ClientConfigBehavior">
<dataContractSerializer maxItemsInObjectGraph="6553600" />
<clientCredentials>
<serviceCertificate>
<authentication certificateValidationMode="None" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint name="ClientConfig"
binding="netTcpBinding"
bindingConfiguration="MyTcpBinding_IFileXferService"
behaviorConfiguration="ClientConfigBehavior"
contract="ServiceRefs.IFileXferService" />
</client>
</system.serviceModel>
</configuration>
Но теперь, когда я перенес информацию о конфигурации в код (чтобы можно было распространять DLL без файла .config), я снова получаю исключение, упомянутое выше. (Кстати, если мы выясним, что данный параметр необходимо изменить, я могу добавить его в наш собственный файл конфигурации xml.)
Код, предназначенный для замены вышеуказанного конфига, выглядит следующим образом:
...
netTcpBinding = new NetTcpBinding();
endpointAddr = new EndpointAddress(HostURI);
updateMaxItemsBehavior(); // method below this snippet
TimeSpan tsTwoHours = new TimeSpan(2,0,0);
netTcpBinding.ReceiveTimeout = tsTwoHours;
netTcpBinding.SendTimeout = tsTwoHours;
netTcpBinding.TransferMode = TransferMode.Streamed;
netTcpBinding.MaxBufferSize = 65536;
netTcpBinding.MaxReceivedMessageSize = 2147483647;
netTcpBinding.ReaderQuotas.MaxStringContentLength = 2147483647;
netTcpBinding.ReaderQuotas.MaxArrayLength = 2147483647;
netTcpBinding.ReaderQuotas.MaxBytesPerRead = 65536;
// double the 64k default
netTcpBinding.MaxBufferPoolSize = 131072;
netTcpBinding.Security.Mode = SecurityMode.Transport;
netTcpBinding.Security.Transport.ClientCredentialType =
TcpClientCredentialType.None;
// now to instantiate the service proxy client
svcClient = new FileXferServiceClient(netTcpBinding, endpointAddr);
Я пробовал это с различными комбинациями этих следующих битов, но не могу
обойти чертовски исключение.
// Set the certificate for the client.
X509Certificate2 cert = new X509Certificate2();
svcClient.ClientCredentials.ClientCertificate.Certificate = cert;
//svcClient.ClientCredentials.ClientCertificate.SetCertificate(
// StoreLocation.LocalMachine,
// StoreName.My,
// X509FindType.FindByThumbprint,
// "ThumbprintThumbprintThumbprintThumbprint");
// here's this
//
private void updateMaxItemsBehavior()
{
svcEndpoint = new ServiceEndpoint(
new ContractDescription("IFileXferService"));
foreach (OperationDescription operation in
svcEndpoint.Contract.Operations)
{
operation.Behaviors
.Find<DataContractSerializerOperationBehavior>()
.MaxItemsInObjectGraph = 6553600;
}
}
Таким образом, наше тестовое приложение Winforms (и, следовательно, клиентская часть нашего приложения WCF) прекрасно работает с параметрами конфигурации в файле wfappname.exe.config, но теперь, когда я попытался перенести все это в код Видимо требует сертификат. Полагаю, на что я действительно надеюсь, так это «как мне продублировать вышеуказанный app.config в коде, чтобы app.config не требовался моим клиентом WCF».
Может кто-нибудь помочь мне с этим? (Я буду твоим лучшим другом!); )
Спасибо,
Скотт