好的,我有一个 WCF 服务,它的行为非常尴尬。问题是,当我像这样调用服务方法时:
using (var wcf = new Wcf<IDroneService>("http://test.group.com/DroneService.svc"))
{
wcf.Channel.StartLoadTest(scenario);
}
直到请求在一分钟后超时,才会发生任何事情,但是只有在此时,在抛出异常之后,WCF 服务(托管在 IIS 中)才会启动,即实际加载其程序集,并运行 Application_Start,在服务器端实例化服务端点等,然后它继续正确接收请求并执行它。但这只会在请求超时并引发异常后发生。
这是我配置客户端和服务器绑定(bind)的方式:
public class WcfConfigurator
{
public Binding GetBinding()
{
var basic = new BasicHttpBinding
{
MaxBufferSize = int.MaxValue,
MaxBufferPoolSize = int.MaxValue,
MaxReceivedMessageSize = int.MaxValue,
TransferMode = TransferMode.Streamed,
ReceiveTimeout = TimeSpan.FromSeconds(30),
ReaderQuotas =
{
MaxDepth = int.MaxValue,
MaxStringContentLength = int.MaxValue,
MaxArrayLength = int.MaxValue,
MaxBytesPerRead = int.MaxValue,
MaxNameTableCharCount = int.MaxValue
}
};
return basic;
}
public void ConfigureBehavior(ServiceEndpoint endpoint)
{
foreach (OperationDescription op in endpoint.Contract.Operations)
{
var dataContractBehavior = op.Behaviors.Find<DataContractSerializerOperationBehavior>();
if (dataContractBehavior != null)
{
dataContractBehavior.MaxItemsInObjectGraph = int.MaxValue;
}
}
}
public void ConfigureBehavior(KeyedByTypeCollection<IServiceBehavior> behaviors)
{
var serviceDebugBehavior = behaviors.Find<ServiceDebugBehavior>();
if (serviceDebugBehavior != null)
{
serviceDebugBehavior.IncludeExceptionDetailInFaults = Config.Wcf.ExceptionDetails;
}
}
}
我在服务器端使用相同的编程配置来构建端点。 这个问题只出现在大信封上,这不是小信封的问题。
我是否在我的 Wcf channel 配置中遗漏了什么? Wcf<T>
只是 ChannelFactory.CreateChannel
的包装;在 WCF 服务器上,我也使用 Windsor WcfIntegration 工具以编程方式配置它。像这样:
public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses)
{
ServiceHostBase serviceHost = base.CreateServiceHost(constructorString, baseAddresses);
return ConfiguredServiceHost(serviceHost);
}
private T ConfiguredServiceHost<T>(T serviceHost) where T : ServiceHostBase
{
serviceHost.AddDefaultEndpoints();
wcfConfigurator.ConfigureBehavior(serviceHost.Description.Behaviors);
foreach (ServiceEndpoint endpoint in serviceHost.Description.Endpoints)
{
endpoint.Binding = wcfConfigurator.GetBinding();
wcfConfigurator.ConfigureBehavior(endpoint);
}
return serviceHost;
}
尽管我认为这不是服务器端问题(至少到目前为止不是),因为正如我所说,如果信封太大(直到请求超时,无论如何都会处理它)。
有没有人遇到过这个奇怪的问题?
最佳答案
根据我使用 WCF 的经验 - WCF 错误很难预测和诊断,需要深入调查并启用大量日志记录和 WCF 跟踪。我觉得客户端/服务器服务超时存在一些错误配置。所以安装最新版本的 Fiddler,看看发生了什么,发送了哪些请求,是否发送了响应。还可以使用 switchLevel="All"
启用 WCF 跟踪,在大多数情况下,WCF 跟踪日志会明确指出问题。
你提到 1 分钟...
Timeouts in WCF and their default values
These are the most well known timeouts.
SendTimeout
,ReceiveTimeout
,OpenTimeout
andCloseTimeout
. They can be set easily either through config or code on the Binding. The default value for those are 1 minute
尝试显式增加它的值,但我建议首先了解问题是什么,为什么会出现,因为 1 分钟建立连接就足够了。
关于c# - WCF 服务超时,然后执行操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13614108/