2010-05-28 21 views
1

我有一個Silverlight 3控件使用的wcf服務。 Silverlight客戶端使用在運行時構建從控制的初始化參數這樣的basicHttpBindinging:silverlight 3:長時間運行wcf調用觸發器401.1(拒絕訪問)

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。

如果我限制結果集的大小,調用就會結束。

從提琴手附加觀察: 當方法2被修改爲返回一個結果集更小(以及避免該問題),控制初始化包括4個電話:

  1. 服務1 /方法1 - 結果:401
  2. 服務1 /方法1 - 結果:401(此時報頭包括元件 「授權:協商TlRMTV ...」
  3. 服務1 /方法1 - 結果:200
  4. 服務1 /方法2 - 結果:200(1.25秒),

當方法2被配置成返回結果集較大,我們得到:

  1. 服務1 /方法1 - 結果:401
  2. 服務1 /方法1 - 結果:401(此時報頭包括元件「授權:協商TlRMTV ...」
  3. 服務1 /方法1 - 結果:200
  4. 服務1 /方法2 - 結果:401.1(7.5秒),
  5. 服務1 /方法2 - 結果:401.1(15毫秒)
  6. 服務1 /方法2 - 結果:401.1(7.5秒)
+1

你在做的併發請求時打401?即在前一個呼叫仍在處理的同時撥打第二個電話?如果是這樣,這可能表示Wcf併發配置不正確。 – 2010-05-28 18:01:05

+0

我不相信有併發請求。我添加了一些來自Fiddler觀察的帖子 – 2010-05-28 19:40:34

+0

我發現如果我在1560個元素上限制記錄集,服務調用會正常返回。如果我在1561時限制記錄集,則服務調用失敗。這是一致的。此外,我正在做一個服務跟蹤,但結果幾乎不可讀.....將追求更好的跟蹤輸出。 – 2010-05-28 22:46:24

回答

1

問題在於配置服務行爲。這奏效了:

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

見丹尼爾·伯格斯滕這裏後:more information

+0

順便說一句,服務器跟蹤的xml輸出格式不正確,所以使用System.Diagnostics.TextWriterTraceListener創建時讀取起來要容易得多 – 2010-05-28 23:14:26