我有一个由 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 错误。
Service 的 HttpBinding 定义了 10 分钟的 closeTime、openTimeout、receiveTimeout 和 sendTimeOut。
如果我限制结果集的大小,则调用成功。
来自 Fiddler 的其他观察:当修改 Method2 以返回较小的结果集(并避免该问题)时,控件初始化由 4 个调用组成:
- 服务 1/方法 1——结果:401
- Service1/Method1 -- 结果:401(这次标头包括元素“授权:协商 TlRMTV...”
- 服务 1/方法 1——结果:200
- Service1/Method2 -- 结果:200(1.25 秒)
当 Method2 配置为返回更大的结果集时,我们得到:
- 服务 1/方法 1——结果:401
- Service1/Method1 -- 结果:401(这次标头包括元素“Authorization:Negotiate TlRMTV...”
- 服务 1/方法 1——结果:200
- Service1/Method2 -- 结果:401.1(7.5 秒)
- Service1/Method2 -- 结果:401.1 (15ms)
- Service1/Method2 -- 结果:401.1(7.5 秒)