c# - 尽管绑定超时设置,WCF 异常超时
问题描述
我的系统由一堆可供各种客户端使用的 WCF 服务组成。
我要做的第一件事是以交互模式运行服务(我有一个控制台弹出并让我知道服务已启动)。
然后我可以运行一个给定的客户端来执行我的任何 WCF 服务。实例化客户端时,通过以下方式创建通道和关联的超时:
var ctx = new InstanceContext(TestCallbackProxy.Instance);
string baseAddress = Constants.ServiceBaseAddress;
var binding = new NetNamedPipeBinding();
binding.MaxConnections = 10;
binding.OpenTimeout = System.TimeSpan.FromMinutes(1);
binding.CloseTimeout = System.TimeSpan.FromMinutes(1);
binding.ReceiveTimeout = System.TimeSpan.FromMinutes(5);
binding.SendTimeout = System.TimeSpan.FromMinutes(5);
var channelFactory = new DuplexChannelFactory<ITestService>(ctx, binding, new EndpointAddress(baseAddress + serviceName));
// Create channel to a specified endpoint
_channel = channelFactory.CreateChannel() as ITestService;
现在,该服务最终会在一段时间未使用时超时,据我所知,这是可以预料的。IE。如果未使用,该通道将简单地消失/被系统丢弃-我相信这与可重用性和优化有关。
但是,当试图证明这一理论并减少所有超时时,我无法让服务中断。IE。在尝试使用服务超过 30 秒时,服务是否应该不会超时/中断?使用的超时是:
binding.OpenTimeout = System.TimeSpan.FromMinutes(0.5);
binding.CloseTimeout = System.TimeSpan.FromMinutes(0.5);
binding.ReceiveTimeout = System.TimeSpan.FromMinutes(0.5);
binding.SendTimeout = System.TimeSpan.FromMinutes(0.5);
解决方案
我认为原因是您应该在服务端设置超时,在服务端设置主机和定义端点,而不是在客户端。这是一个例子:
var binding = new NetNamedPipeBinding();
binding.MaxConnections = 10;
binding.OpenTimeout = TimeSpan.FromMinutes(0.5);
binding.CloseTimeout = TimeSpan.FromMinutes(0.5);
binding.ReceiveTimeout = TimeSpan.FromMinutes(0.5);
binding.SendTimeout = TimeSpan.FromMinutes(0.5);
// Compose URIs
Uri uriBase = new Uri(baseAddress);
Uri uri = new Uri(baseAddress + something);
Uri uriMex = new Uri(baseAddress + something + "/mex");
// Create End Points
SomeHost = new CustomServiceHost(typeof(TestService), uriBase);
SomeHost.AddServiceEndpoint(typeof(ITestService), binding, uri);
SomeHost.AddServiceEndpoint(typeof(IMetadataExchange), binding, uriMex);
// Open the ServiceHost
SomeHost.Open();
现在你应该看到你的服务在 30 秒后死亡。
推荐阅读
- c# - Roslyn c# 编译器:非托管结构被检测为可为空,但我想知道这是否是一个悖论
- css - MuiCssBaseline 用不透明度覆盖背景图像
- python - if == 条件未在 django 模板中输出预期结果
- python - Django - 将复选框输入保存到数据库并更新页面
- angular - 同时在同一工作区上构建 Angular 库和应用程序
- node.js - 用于 Node 的 Typescript 库作为 NPM 中的混合包
- python - 在我的本地机器上安装 pyobjc-framework-Quartz 6.2.2 失败
- android - 无法使用 React Native 应用程序将图像上传到 Django 服务器
- python - Python中的列表排序算法不运行
- laravel - 设置 laravel 项目