私はbasicHttpBindingを使用している非常に単純なWCF一方向サービス(IISでホストされている)を持っています:
<service name="OptumRx.Formulary.ServiceLayer.UserRequestService" behaviorConfiguration="UserRequestBehaviors">
<endpoint
address=""
binding="basicHttpBinding" bindingConfiguration="WindowsAuthBinding"
contract="OptumRx.Formulary.ServiceLayer.IUserRequestService">
</endpoint>
</service>
<client>
<endpoint address="....."
binding="basicHttpBinding" bindingConfiguration="WindowsAuthBinding"
contract="OptumRx.Formulary.ServiceLayer.IUserRequestService">
</endpoint>
</client>
<basicHttpBinding>
<binding name="WindowsAuthBinding" sendTimeout="00:00:15" >
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
<serviceBehaviors>
<behavior name="UserRequestBehaviors">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceThrottling maxConcurrentCalls="2" maxConcurrentInstances="2"/>
</behavior>
</serviceBehaviors>
コード スニペット:
// interface, declarying one way contract
[OperationContract(IsOneWay = true)]
void SubmitUserRequest(RequestServiceObject request);
// setting per call instancing and multiple concurrency
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.PerCall)]
public class UserRequestService : IUserRequestService {
}
// how the client calls the service (client is asp.net page hosted within same site as service)
ChannelFactory<IUserRequestService> factory = new ChannelFactory<IUserRequestService>("*");
IUserRequestService proxyUserRequest = factory.CreateChannel();
try {
proxyUserRequest.SubmitUserRequest(so);
} catch {
// timeout error caught
} finally {
((IClientChannel)proxyUserRequest).Close();
factory.Close();
}
この呼び出しは、潜在的に負荷の高いデータベース/IO 作業を行うため、同時呼び出しの最大数を調整する必要がある場合があります。そのスロットルに達した場合、通話がキューに入れられるのを止める方法はありますか?
上記の構成では、2 つの呼び出しが処理され、3 つ目の呼び出しがタイムアウトします (例外がスローされてキャッチされます)。Service Trace Viewer では、次のように表示されます。
The system hit the limit set for throttle 'MaxConcurrentCalls'. Limit for this throttle was set to 2. ....
The HTTP request to '' has exceeded the allotted timeout of 00:00:15. The time allotted to this operation may have been a portion of a longer timeout.
しかし、最初の 2 つの呼び出しが完了すると、3 番目のメッセージがまだリスナー チャネルに存在し、実行されます。
一方向構成を使用している間にコールを中止する方法はありますか? サービスが「ビジー」であることをユーザーに知らせ、後で再試行してもらいたい..
ありがとうございました