2013-10-18 41 views
0

我需要向WCF服務發送大約10,000行數據,WCF服務又將其逐個插入到數據庫中。這個過程需要1個多小時。但是,從開始操作一小時後,我得到一項未發現的服務,我相信這是一段時間以後的事情。 但是,只要Visual Studio開發服務器繼續運行,服務就會繼續將此數據插入到數據庫中。如何防止調用由Silverlight客戶端創建的WCF服務獲取超時

我已經嘗試在客戶端和服務端設置所有超時值到2小時,但它沒有幫助。

的web.config服務:

<bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_IDService" allowCookies="true" maxBufferPoolSize="2147483647" 
         maxReceivedMessageSize="2147483647" closeTimeout="02:00:00" 
         openTimeout="02:00:00" receiveTimeout="02:00:00" sendTimeout="02:00:00"> 
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
            maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
            maxNameTableCharCount="2147483647"/> 
      <security mode="None"/> 

     </binding> 
     </basicHttpBinding> 
    </bindings> 

在客戶端(在初始化serviceclient)

this.binding.ReceiveTimeout = TimeSpan.FromHours(2); 
    this.binding.OpenTimeout = TimeSpan.FromHours(2); 
    this.binding.SendTimeout = TimeSpan.FromHours(2); 
    this.binding.CloseTimeout = TimeSpan.FromHours(2); 

    this.binding.MaxBufferSize = int.MaxValue; 
    this.binding.MaxReceivedMessageSize = int.MaxValue; 

我做了一些搜索,並在很多地方被建議增加OperationTimeout。所以我嘗試了但沒有任何成功。

((IContextChannel)base.Channel).OperationTimeout = new TimeSpan(2, 0, 0); 

請給我一些想法,我應該嘗試使服務完成整個操作並將響應發送回客戶端。 另外,讓我知道如果你認爲有更好的方法來做這個操作。

回答

1

有一些選項,你可以嘗試:在不同的線程

  1. 開始書面方式。

這樣可以更快速地響應,告訴數據已成功接收。 然後,您可以詢問服務是否已經寫入數據 - 您甚至可以對迄今爲止寫入的數據做出響應。 最後你可以得到答覆。

  1. 一次只能發送幾條記錄。

這樣您可以更快地響應並顯示進度。

  1. 優化寫入。

兩小時寫入10000條記錄的時間非常龐大。 也許你應該看看SqlBulkCopy並將其與DataTable結合使用,這可以提高速度,但只能用於插入。

您可以將1和2合併到編號3中。

祝您好運與您的追求。

+0

非常感謝您的建議。我絕對可以直接嘗試第二和第三。不過,第一點對我來說不是很清楚。你是否暗示使用雙工綁定來讓服務發送多個響應? – Raj

+0

另外我想知道爲什麼手術會在開始後的一個小時內中斷。 – Raj

+0

首先是發送記錄(和以前一樣),服務返回「收到的數據,我正在處理它,你可以使用這個ID獲得狀態」。然後你可以通過id來請求狀態(狀態可以是寫了多少條記錄等)。完成狀態後,您可以使用該ID查詢結果。這有點複雜,但是暫停幾個小時不是一個好方法。 – Casperah

1

我想你的web服務端點被殺了,因爲它沒有在合理的時間內響應應用服務器。第二件事我會注意到,你在Web服務端做了2個多小時。根本不是很好的解決方案。

在情況下,如果您處理數據保存之前:

我sugest你的地方存儲所有的數據在DB和具有另外一個看門狗或「招聘」或「隊列管理器」 Proess得到這份工作的完成的背景。

如果不是那麼的情況下,我有一個問題:

爲什麼它需要2個小時才能將數據保存?

+0

謝謝..我同意它不是一個非常好的解決方案,必須等待2個小時。但是我正在使用一個傳統的應用程序,它在做了一些處理之後將這個作業寫入數據庫。但有一點我還不清楚,爲什麼手術在開始後的1小時內就會中斷? – Raj