わかりました、私は WCF サービスを持っていますが、これはかなり厄介な方法で動作しています。問題は、サービス メソッドを呼び出すと、次のようになります。
using (var wcf = new Wcf<IDroneService>("http://test.group.com/DroneService.svc"))
{
wcf.Channel.StartLoadTest(scenario);
}
要求が 1 分後にタイムアウトになるまで何も起こりませんが、例外がスローされた後にのみ、WCF サービス (IIS でホストされている) が開始されます。つまり、実際にそのアセンブリが読み込まれ、Application_Start が実行され、サービスのインスタンスがサーバー側のエンドポイントなどで、リクエストを適切に受け取り、実行します。ただし、これは、リクエストがタイムアウトして例外がスローされた後にのみ発生します。
これは、クライアントとサーバーの両方のバインドを構成する方法です。
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 サーバーのシンボルが読み込まれないためです。 、とにかく処理されます)。
以前にこの奇妙な問題に遭遇した人はいますか?