2011-12-10 42 views
0

我正在測試一個有兩個表(衛星和頻道)的數據庫,因爲我需要使用WCF。幸運的是,我現在已經嘗試了我所知道的和網上的一切,並且我無法解決問題。SQL Server到WCF開發的錯誤

這是合同IService.cs

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    List<Satalite> SelectSatalite(int satNum); 

    [OperationContract] 
    List<Satalite> SataliteList(); 

    [OperationContract] 
    List<Channel> ChannelList(int satNum); 

    [OperationContract] 
    String Sat(int satNum); 

} 

服務這是Service.svc.cs文件

public class Service : IService 
{ 
    DataDbDataContext DbObj = new DataDbDataContext(); 

    public List<Satalite> SataliteList() 
    { 
     var satList = from r in DbObj.Satalites 
         select r; 

     return satList.ToList(); 
    } 

    public List<Satalite> SelectSatalite(int satNum) 
    { 
     var satList = from r in DbObj.Satalites 
         where r.SateliteID == satNum 
         select r; 

     return satList.ToList(); 
    } 

    public List<Channel> ChannelList(int satNum) 
    { 
     var channels = from r in DbObj.Channels 
         where r.SateliteID == satNum 
         select r; 

     return channels.ToList(); 
    } 


    public String Sat(int satNum) 
    { 
     Satalite satObj = new Satalite(); 

     satObj = DbObj.Satalites.Single(p => p.SateliteID == satNum); 
     return satObj.Name; 
    } 
} 

每當我嘗試運行前三使用wcftestclient.exe測試時他們,我得到一個錯誤,最後一個沒有問題的作品。

底層連接已關閉:連接意外地關閉了 。

服務器堆棧跟蹤:
在System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(引發WebException 引發WebException,HttpWebRequest的請求,HttpAbortReason abortReason)
在System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(時間跨度 超時)
在System.ServiceModel.Channels.RequestChannel.Request(消息消息,時間跨度 超時)
在System.ServiceModel.Dispatcher.RequestChannelBinder.Request(消息 消息,時間跨度超時)
在System.ServiceModel.Channels.ServiceChannel.Call(字符串動作, 布爾單向,ProxyOperationRuntime操作,對象[]插件, 對象[]奏,時間跨度超時)
在System.ServiceModel.Channels.ServiceChannelProxy.InvokeService( IMethodCallMessage 包括methodCall,ProxyOperationRuntime操作)
在System.ServiceModel.Channels.ServiceChannelProxy.Invoke(即時聊天 消息)[0]時

異常重新拋出:
在System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage( IMessage reqMsg,IMessage retMsg)
在System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData & MSGDATA,的Int32類型)在IService.SelectSatalite(的Int32 satNum)
在ServiceClient.SelectSatalite(的Int32 satNum)

內部異常:底層連接已關閉:連接 意外關閉。
在System.Net.HttpWebRequest.GetResponse()
在System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(時間跨度 超時)

我的理解是錯誤的定製情況如果我使用.net編譯器的已知類型(例如,intstring),那麼它就可以正常工作。幸運的是,我沒有找到解決方案。

回答

1

的錯誤似乎是兩個原因:

  1. 一個超時因爲你返回了太多的數據,例如從數據庫中的數據的選擇時間太長的服務方法及時

    或完成:

  2. 郵件大小太大,因爲你選擇太多的數據,因此WCF通信中止整個數據已經返回前

我的解決辦法:

  • 不要選擇表中的所有數據!只返回儘可能多的數據,你可以真正處理/顯示,例如10行,20行或最多100行的....

試試這個 - 如果你改變你的方法:

public List<Satalite> SataliteList(int count) 
{ 
     var satList = (from r in DbObj.Satalites 
        select r).Take(count); 

     return satList.ToList(); 
} 

是否可以從WCF測試客戶端與例如調用此count = 10count = 50 ??

+0

感謝您的回覆,我與你,我返回了太多的數據(你說的每個!!約8〜12列),但我的程序需要它。所以,我問有沒有一種方法可以延長時間,以避免超時或增加信息的大小,因爲我需要這些信息!?!。另外,我測試了一次選擇某些行的想法,但即使count = 1,我仍然有錯誤!!! – darking050

+0

@ darking050:是的,當然你可以增加超時和允許消息的大小 - 但這只是真正的問題之上的「樂隊幫助」 - 爲什麼你需要傳輸這麼多的數據?也許你應該使用不同的方法,而不是通過服務傳輸,如果它是這麼多的數據.... –

0

調整服務器端和客戶端的超時設置將對您有所幫助。

服務器端調整的結合元件和客戶端上的的SendTimeout屬性調整的結合元件的RecieveTimeout屬性。

感謝,