gpt4 book ai didi

C# WCF 客户端需要很长时间才能打开状态 (DuplexClientBase.Open())

转载 作者:行者123 更新时间:2023-11-30 18:41:45 30 4
gpt4 key购买 nike

我在使用 WCF 客户端时遇到一点问题。首先,请允许我向您解释并提供详细信息。

我目前正在开发一个系统,我正在考虑将主应用程序分开,因为我将其设计为使用 dll 进行更新。所以我找到了 MEF,并开始大量阅读它。但是 MEF 有问题,它锁定了文件,无法写入。然后我找到了影子副本。所以现在我将客户端放在主应用程序的另一个 AppDomain 中。我了解到通过 NET Remoting 可以实现跨域通信,因此我进行了研究并使用 WCF 完成了它。

主应用程序是主机,它在新域中加载程序集并启动客户端。由于客户端是一个 DLL,因此没有用于加载绑定(bind)、端点的 AppConfig 文件。我已经创建了一个类来帮助我,所以配置是通过编程方式添加的。

终于成功了!

但是有一点我觉得不太好。在客户端,执行指令DuplexClientBase.Open()时,需要20秒才能打开。我认为不可行,因为当我将客户端移动到 EXE(记住是一个 DLL 并且配置是通过编程方式添加的)时,它并不需要那么多时间。

可能配置有问题,但我找不到。所以这是源代码文件。首先,这是 App.config 文件,当客户端在控制台应用程序中时:

<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="TcpBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog="10"
maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
maxReceivedMessageSize="65536">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Transport">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
<wsDualHttpBinding>
<binding name="HttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false"
transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00" />
<security mode="Message">
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" />
</security>
</binding>
</wsDualHttpBinding>
</bindings>
<client>
<endpoint address="net.tcp://localhost:8080/ProtoServicio/EPServicioTcp"
binding="netTcpBinding" bindingConfiguration="TcpBinding"
contract="TestServicio.IServicio" name="TcpBinding">
<identity>
<userPrincipalName value="OlinzerLaptopV\Olinzer" />
</identity>
</endpoint>
<endpoint address="http://localhost:8081/ProtoServicio/EPServicioHttp"
binding="wsDualHttpBinding" bindingConfiguration="HttpBinding"
contract="TestServicio.IServicio" name="HttpBinding">
<identity>
<userPrincipalName value="OlinzerLaptopV\Olinzer" />
</identity>
</endpoint>
</client>
</system.serviceModel>

现在,这是创建绑定(bind)和端点的代码:

        internal static Binding GetBinding()
{
WSDualHttpBinding binding = new WSDualHttpBinding();
TimeSpan span = new TimeSpan( 0, 1, 0 );

binding.Name = "HttpBinding";
binding.CloseTimeout = span;
binding.OpenTimeout = span;
binding.ReceiveTimeout = span;
binding.SendTimeout = span;
binding.BypassProxyOnLocal = false;
binding.TransactionFlow = false;
binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
binding.MaxBufferPoolSize = 524288;
binding.MaxReceivedMessageSize = 65536;
binding.MessageEncoding = WSMessageEncoding.Text;
binding.TextEncoding = Encoding.UTF8;
binding.UseDefaultWebProxy = true;

binding.ReaderQuotas = new XmlDictionaryReaderQuotas();
binding.ReaderQuotas.MaxDepth = 32;
binding.ReaderQuotas.MaxStringContentLength = 8192;
binding.ReaderQuotas.MaxArrayLength = 16384;
binding.ReaderQuotas.MaxBytesPerRead = 4096;
binding.ReaderQuotas.MaxNameTableCharCount = 16384;

binding.ReliableSession = new ReliableSession();
binding.ReliableSession.Ordered = true;
binding.ReliableSession.InactivityTimeout = span;

binding.Security.Mode = WSDualHttpSecurityMode.Message;

binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
binding.Security.Message.NegotiateServiceCredential = true;
binding.Security.Message.AlgorithmSuite = SecurityAlgorithmSuite.Default;

return binding;
}

代码创建的文件只包含 Http Endpoint。也许添加 tcp 端点可能会有所不同,但是,我不知道该怎么做。上面的函数由 ClientClientBase 类的构造函数调用。

ServiceModel.DuplexClientBase<Servicio> MyClient = new ...<Servicio>(new InstanceContext(this), GetBinding(), GetEndpoint());

如果您还有其他需要,请随时通知我。

最佳答案

您正在单个进程中进行跨 AppDomain 通信并且您正在使用 WsHttpBinding?你知道这有多大的开销吗?它还会大大增加应用程序部署的复杂性。它可能不是你主要问题的根源,但我会从:

  • NetNamedPipeBinding 替换 WsDualHttpBinding

要诊断您的问题,请从 WCF tracing 开始并检查客户端和服务器上的哪个操作需要很长时间 - 某些安全解决方案可能存在问题,因为您的设置使用消息安全性。

关于C# WCF 客户端需要很长时间才能打开状态 (DuplexClientBase<T>.Open()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6501713/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com