- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 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/
我在使用 WCF 客户端时遇到一点问题。首先,请允许我向您解释并提供详细信息。 我目前正在开发一个系统,我正在考虑将主应用程序分开,因为我将其设计为使用 dll 进行更新。所以我找到了 MEF,并开始
我应该在 DuplexClientBase 构造函数的“endpointConfigurationName”参数中指定什么? 无论我在那里放什么,客户端都会抛出提示 “无法在 ServiceModel
我是一名优秀的程序员,十分优秀!