好的,我有一个WCF服务,它表现得非常尴尬。问题是,当我调用服务方法时,就像这样:
using (var wcf = new Wcf<IDroneService>("http://test.group.com/DroneService.svc"))
{
wcf.Channel.StartLoadTest(scenario);
}
在请求超过一分钟后才会发生任何事情,但是之后,只有在抛出异常后,WCF服务(在IIS中托管)启动,即实际加载其程序集,并运行Application_Start,实例化服务器端的服务端点等,然后继续 正确接收请求,然后执行 。但这只发生 AFTER 请求超时并抛出异常。
这是我配置客户端和服务器绑定的方式:
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频道的配置中遗漏了什么? 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服务器的符号甚至不会加载(直到请求超时,无论如何都要处理。)
有没有人遇到过这个奇怪的问题?
答案 0 :(得分:0)
根据我对WCF的经验 - WCF错误很难预测和诊断,需要进行深入调查,并启用广泛的日志记录和WCF跟踪。我觉得客户端/服务器服务超时有一些配置错误。所以安装最新版本的Fiddler,看看发生了什么,发送了哪些请求,是否发送了响应。还可以使用switchLevel="All"
启用WCF跟踪,在大多数情况下,WCF跟踪日志明确指出了一个问题。
你提到1分钟......
Timeouts in WCF and their default values
这些是众所周知的超时。
SendTimeout
,ReceiveTimeout
,OpenTimeout
和CloseTimeout
。他们可以设置 很容易通过配置或Binding上的代码。默认值 对于那些 1分钟
尝试明确增加其值,但首先我建议了解问题是什么,为什么会出现,因为1分钟到达estblish连接就足够了。
答案 1 :(得分:0)
我之前遇到过与WCF类似的问题,它让我在使用服务时使用了ChannelFactory。我知道它不能解释你的错误,但也许值得一试。我是这样做的:
internal static class ServiceObjects
{
public static ISomeService SomeSVC { get { return GetSomeServiceClient(); }
private static BasicHttpBinding _Binding = new BasicHttpBinding("SomeBasicHttpBindingEndpoint");
private static EndpointAddress _Endpoint = new EndpointAddress(new Uri("http://test.helloworld.com/SomeService.svc"));
private static IDocManagerService GetDocServiceClient()
{
ChannelFactory<ISomeService> _someSvcFactory = new ChannelFactory<ISomeService>(_Binding, _Endpoint);
foreach (OperationDescription op in _someSvcFactory.Endpoint.Contract.Operations)
{
DataContractSerializerOperationBehavior _dataContractBehavior = op.Behaviors.Find<DataContractSerializerOperationBehavior>() as DataContractSerializerOperationBehavior;
if (_dataContractBehavior != null)
{
_dataContractBehavior.MaxItemsInObjectGraph = int.MaxValue;
}
}
return _someSvcFactory.CreateChannel();
}
}
并使用该服务:
ServiceObjects.SomeSVC.SomeMethod()