Silverlight 3 コントロールによって消費される wcf サービスがあります。Silverlight クライアントは、次のように、コントロールの初期化パラメーターから実行時に構築される basicHttpBindinging を使用します。
public static T GetServiceClient<T>(string serviceURL)
{
BasicHttpBinding binding = new BasicHttpBinding(Application.Current.Host.Source.Scheme.Equals("https", StringComparison.InvariantCultureIgnoreCase)
? BasicHttpSecurityMode.Transport : BasicHttpSecurityMode.None);
binding.MaxReceivedMessageSize = int.MaxValue;
binding.MaxBufferSize = int.MaxValue;
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
return (T)Activator.CreateInstance(typeof(T), new object[] { binding, new EndpointAddress(serviceURL)});
}
サービスは Windows セキュリティを実装します。結果セットが数千行に増加し、その時点で HTTP 401.1 エラーが受信されるまで、呼び出しは期待どおりに返されていました。
サービスの HttpBinding は、10 分の closeTime、openTimeout、receiveTimeout、および sendTimeOut を定義します。
結果セットのサイズを制限すると、呼び出しは成功します。
Fiddler からの追加の観察: Method2 を変更してより小さな結果セットを返す (そして問題を回避する) 場合、コントロールの初期化は 4 つの呼び出しで構成されます。
- Service1/Method1 -- 結果:401
- Service1/Method1 -- 結果:401 (この時間のヘッダーには、「Authorization: Negotiate TlRMTV...」という要素が含まれています。
- Service1/Method1 -- 結果:200
- Service1/Method2 -- 結果:200 (1.25 秒)
Method2 がより大きな結果セットを返すように構成されている場合、次のようになります。
- Service1/Method1 -- 結果:401
- Service1/Method1 -- 結果:401 (この時間のヘッダーには、「Authorization:Negotiate TlRMTV...」という要素が含まれています。
- Service1/Method1 -- 結果:200
- Service1/Method2 -- 結果:401.1 (7.5 秒)
- Service1/Method2 -- 結果:401.1 (15ms)
- Service1/Method2 -- 結果:401.1 (7.5 秒)