CodeGo.net>需要如何帮助将system.serviceModel配置部分移到我的代码
作者:互联网
我已经为当前的雇主开发了一个客户端/服务器应用程序,其中一项要求是将客户端部分作为DLL分发.由于DLL不会“执行” dllName.dll.config文件,因此我需要将配置移到代码中.我已尽我所能做到了,但现在却遇到了例外.
The X.509 certificate CN=ComputerName chain building failed.
The certificate that was used has a trust chain that cannot
be verified. Replace the certificate or change the certificateValidationMode.
An internal certificate chaining error has occurred.
我已经用谷歌搜索了,或者搜索了所有的解决方案,但是到目前为止,我找不到关于我所见过的各种封闭但非真正解决方案的足够清晰的解释的东西.
无论如何,“我的本地存储区”中有一个证书,但就我所知,它实际上仅由服务器使用(当前在同一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>
但是,既然我已经将配置信息移到了代码中(这样就可以在没有.config文件的情况下分发DLL),我再次遇到了上面提到的异常. (顺便说一句,如果我们确定给定的设置需要更改,则可以将其添加到我们自己的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,以便WCF客户端不需要app.config.”
谁能帮我这个? (我将是你最好的朋友!); )
谢谢,
史考特
解决方法:
我觉得你是男人.
我不喜欢这样的想法,例如,当将WCF服务部署到IIS中时,我必须将.config东西嵌入到web.config中,或者当以其他方式托管时,将.config并嵌入到代码中.
我的解决方法是使用覆盖默认ApplyConfiguration()逻辑的自定义服务主机.在服务端,它允许WCF DLL在dllname.dll.config(或实际上在任何地方)中查找其配置.
它是all explained here.该信息也在this answer on Stackoverflow中重复.
您正在使用WCF客户端,因此您需要覆盖ApplyConfiguration() method in a custom ChannelFactory.这在here中进行了描述.在该论坛帖子中,还描述了一种替代技术,其中您在其中覆盖CreateDescription()并指定了替代.config文件路径.这些方法非常相似.两者都应该在WCF客户端中工作.
您可能还考虑将.config作为资源嵌入到.dll中.这样,您仍然有一个单文件发行版(dll),但是您可以使用xml config语法指定所有内容.在生成时,将.config文件嵌入DLL.在您的自定义ApplyConfiguration()中的运行时,您必须调用
Assembly.GetManifestResourceStream();,传递字符串“ dllname.dll.config”以获取包含配置信息的只读流.
如果要允许用户覆盖嵌入式配置,则可以将该智能引入自己的ApplyConfiguration()实现中.可能首先寻找文件系统文件;如果不存在,则回退到嵌入式.config文件.
这个答案并没有真正告诉您如何将配置设置转移到代码中,因为我认为这是一个令人发指的想法.但是也许它仍然可以解决您的问题.
标签:client-side,app-config,wcf,c 来源: https://codeday.me/bug/20191209/2095686.html