2016-10-09 5 views
0

私はMVCアプリケーションをwcfサービスに接続していますが、私は他のタスクに依存するタスクを備えたtodoリストアプリケーションを作ろうとしています。これまではこれで不運でしたが、ストアドプロシージャこれはWCFサービスから呼び出して、クライアントに返信します。データリストに記入しようとすると、WCFサービスがタイムアウトするのはなぜですか?

現在、クライアントは1分間応答しないと次のエラーが発生します。

"The request channel timed out while waiting for a reply after 00:01:00. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout." 

私のWCFサービスのコードは次のようになります。

public DataTable GetAllDependantTasks(string id) 
     { 
      DataTable dt = new DataTable(); 
      try 
      { 
       using (SqlConnection conn = new SqlConnection()) 
       using (SqlCommand com = new SqlCommand()) 
       { 
        conn.ConnectionString = ConfigurationManager.ConnectionStrings["ToDoDatabase"].ConnectionString; 
        com.Connection = conn; 
        com.CommandText = "usp_GetAllDependantTaskInfoByID"; 
        com.CommandType = CommandType.StoredProcedure; 
        com.Parameters.Add(new SqlParameter("@id", id)); 
        conn.Open(); 
        SqlDataReader returnvalue = com.ExecuteReader(); 

        if (returnvalue.HasRows) 
        { 
         //List<DataRow> items = new List<DataRow>(); 
         dt.Load(returnvalue); 

         // foreach (DataRow row in dt.Rows) 
         // { 
         // items.Add(row); 
         //} 

         return dt; 
        } 
        else 
        { 
         throw new RowNotInTableException(); 
        } 

       } 
      } 
      catch (Exception ex) 
      { 
       //TODO: Write error to log 
       return new DataTable(); 
      } 
     } 

フロントエンドでASPXページを使用していますが、問題のコードは次のようになります。

private void LoadTasks() 
     { 
      // get the todo list items 
      ToDoService.ToDoServiceClient client = new ToDoService.ToDoServiceClient(); 

      try 
      { 
       // List<ToDoService.ToDoItemContract> toDoItems = client.GetToDoItems("").ToList(); 


     List<string> Items = new List<string>(); 

      foreach(var row in client.GetAllDependantTasks("").Rows) 
       { 
        Items.Add(row.ToString()); 
       } 

       dlTasks.DataSource = Items; 


       dlTasks.DataBind(); 

       client.Close(); 
      } 
      catch (Exception ex) 
      { 
       // TODO: Log error 
       client.Abort(); 
      } 
     } 

誰も私にこの方向性を指摘できますか?フロントエンドのデータリストに既存のタスクとそれに依存するタスクを記入したいのですが、wcfサービスからdatatableを返してリストにバインドしようとしましたが、それを気に入らないようです!

ありがとうございます。

+0

ストアドプロシージャを個別にテストしましたか?それは実行されますか?また、WCFインターフェイスと契約を投稿してください。 –

答えて

0

返されるデータが多分、時間がかかります。 SqlCommandの既定のタイムアウトは15秒です。あなたは

com.Connection = conn; 
com.CommandTimeout = 0; 

をしようとする場合には、この接続のタイムアウトを無効にして、塗りつぶしを実行するためのより多くの時間を可能に何

。何かがうまくいかない場合、無期限に実行しないように調整してください(時間はミリ秒単位です)。

ない場合は、デフォルトのWCFのタイムスパンがあなたに何が起こっているかである1:00ですので、長いタイムスパンにそれを設定する

Webservice.InnerChannel.OperationTimeout = TimeSpan.FromMinutes(10); 

とWebサービスの操作TIMOUTを設定してみてください。

+0

接続タイムアウトは読み取り専用ですか? –

+0

@ReeceCottamが修正されました。 SqlConnectionではなくSqlCommandです –

+0

sqlcommandにはConnectionTimeoutの定義が含まれていません –

関連する問題