2013-03-31 24 views
1

我發送了各種其他對象通過列表我的WCF服務通過列表沒有任何問題,但是當我嘗試發送此特定對象(在列表中)我得到,排序的超時錯誤。WCF可以返回單個對象就好,但返回列表時失敗

跟蹤標識符是: TraceIdentifier http://msdn.microsoft.com/da-DK/library/System.ServiceModel.Diagnostics.TraceTruncatedQuotaExceeded.aspx

奇怪的是:我得到了完全返回對象(而不是在一個列表)的另一種方法,它工作正常。

此外,當調試時我發現方法(在服務端)返回列表就好了,但它是顯然無法接收它的客戶端。

下面是調用服務方法(它無法上線,宣佈「轉速」):

public void GetReviewsInModule() 
     { 
      using (var db = new RentItServiceClient()) 
      { 
       var revs = db.GetReviewsInModule(1); 
      } 
     } 

這裏的實際返回objectas一個列表的方法(調試它,它精細返回它):

public List<ReviewModule> GetReviewsInModule(int id) 
    { 
     using (Context con = new Context()) 
     { 
      con.Configuration.ProxyCreationEnabled = false; 
      var mod = con.Modules.Find(id); 
      if (mod == null) 
       throw new WebServiceValidationException("Object does not exist"); 
      List<ReviewModule> revs = con.ModuleReviews.Include("User").Where(r => r.Module.Id == id).ToList(); 
      return revs; 
     } 
    } 

此外,在列表中的對象幾乎沒有任何尺寸的,所以請不要告訴我到了發送/接收限制/超時。

+0

很久以前我放棄了SOAP,轉移到REST,並且只是移動了一個json對象 - 是否有使用SOAP服務的特定原因?此外,請檢查WSDL以查看其中是否有對象,或者至少有一個鏈接 - 您正在尋找一個xsd,因爲SOAP使用XML – Matt

+0

該鏈接指向msdn的丹麥突變,並且不起作用。 – Filip

回答

0

根據您發佈的代碼很難給出答案,因爲無法僅從這些少量代碼片段中複製問題。 (您需要發佈ReviewModule的完整定義,您的服務合同等)。

因此,這只是一個猜測,但當我使用端點內的Using塊時,使用WCF和MVC Web Api設置REST風格的Web服務時,我幾次被捕獲。儘管Using是C#中的一個有價值的構造,但我發現如果在代表最終由代碼進行控制的方法中定義了一個方法,而您不控制該方法,那麼Using塊依賴於的IDisposable接口將獲取弄亂。也就是說,你在你的方法中定義了一個對象(在這種情況下是一個名爲「con」的Context類型的對象),並且只是在後面你依賴的WCF框架試圖訪問你的端點中創建的對象。在WCF框架完成其工作時,Context對象上的Dispose()方法很可能已經被您的代碼調用,這意味着WCF框架無法以其需要的方式訪問它能夠返回您的服務打算提供的數據。即使您的方法在完全處於您的控制之下的代碼進行單元測試時可能會出現這種情況,也可能會出現這種情況。

要查看是否這就是問題所在,你的情況,請嘗試在「GetReviewsInModule」方法/服務終端刪除Using塊,像這樣:

public List<ReviewModule> GetReviewsInModule(int id) 
{ 
    Context con = new Context(); 
    con.Configuration.ProxyCreationEnabled = false; 
    var mod = con.Modules.Find(id); 
    if (mod == null) throw new WebServiceValidationException("Object does not exist"); 
    List<ReviewModule> revs = con.ModuleReviews.Include("User").Where(r => r.Module.Id == id).ToList(); 
    return revs; 
} 

如果導致您的端點像預期的那樣開始工作,你可以擔心你將如何管理對象處理,並避免內存泄漏作爲一個單獨的問題。

+0

咦?列表被創建,Context對象被處理,列表被序列化並返回給客戶端,那麼應該是什麼問題呢? – Filip

+0

我只是說我見過的東西,並在面對不允許讀者複製問題的含糊問題描述時提出問題的可能原因。 WCF和MVC Web Api框架有時無法訪問用戶定義代碼中的使用塊中定義的對象。這兩個框架也都沒有報告問題是什麼。 – Deleted

+0

我知道你在做什麼,我只是問是否有意義。使用塊只是在執行離開塊時調用對象的Dispose()的簡寫。在這種情況下,由於當這種情況發生時,revs對象被初始化,那麼Dispose()調用如何導致超時? – Filip

0

這實際上取決於結果列表中有多少元素,而不僅僅是單個元素的大小。有一些配置元素可以使用:

maxReceivedMessageSize 
maxBufferSize 
maxBufferPoolSize 
maxArrayLength 
maxStringContentLength 

另一種解決方案是切換到流式WCF服務。請注意,您不能混合流式和緩衝操作 - 我有時實際上創建了兩個WCF服務,一個用於流操作,另一個用於緩衝操作。

+0

即使列表中只有一個元素,它也會失敗。 此外,我們已經在使用流Wcf。 –

+0

不可能。否則,您的服務將不得不返回'Stream',而不是'List <...>',因爲流式服務只能返回流並將流作爲參數。 –