silverlight 3:长时间运行wcf调用触发器401.1(访问被拒绝)

时间:2010-05-28 17:55:21

标签: silverlight timeout authorization http-status-code-401

我有一个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将closeTime,openTimeout,receiveTimeout和sendTimeOut定义为10分钟。

如果我限制结果集的大小,则调用会超过。

Fiddler的补充意见: 当修改Method2以返回较小的结果集(并避免问题)时,控制初始化包含4个调用:

  1. Service1 / Method1 - 结果:401
  2. Service1 / Method1 - 结果:401(此时标题包含元素“授权:协商TlRMTV ......”
  3. Service1 / Method1 - 结果:200
  4. Service1 / Method2 - 结果:200(1.25秒)
  5. 当Method2配置为返回更大的结果集时,我们得到:

    1. Service1 / Method1 - 结果:401
    2. Service1 / Method1 - 结果:401(此时标题包含元素“授权:协商TlRMTV ......”
    3. Service1 / Method1 - 结果:200
    4. Service1 / Method2 - 结果:401.1(7.5秒)
    5. Service1 / Method2 - 结果:401.1(15ms)
    6. Service1 / Method2 - 结果:401.1(7.5秒)

1 个答案:

答案 0 :(得分:1)

问题是服务行为的配置。这就是诀窍:

<behavior name="SRMS.Services.GraphicPointServiceBehavior">
    <serviceMetadata httpGetEnabled="true"/>
 <serviceDebug includeExceptionDetailInFaults="true"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>

请参阅Daniel Bergsten的帖子:more information