0

Webサイトのサービスからアイテムのリストを取得するSilverlightアプリがあります。次の関数を使用してObservableCollectionとして渡します。

public ObservableCollection<Dictionary<string, object>> GetItems(string transetDocId)
    {
                    ObservableCollection<Dictionary<string, object>> result = new ObservableCollection<Dictionary<string, object>>();
            foreach (DataRow dr in ((DataTable)HttpContext.Current.Session["ItemDataTable"]).Rows)
            {
                Dictionary<string, object> tempD = new Dictionary<string, object>();
                foreach (DataColumn dc in ((DataTable)HttpContext.Current.Session["ItemDataTable"]).Columns)
                    tempD.Add(dc.ColumnName, dr[dc.ColumnName]);
                result.Add(tempD);
            }
            return result;
        }

すべて正常に機能していました。そして今、私が考えることができる変更なしで、それは次のエラーを返し始めました。

'http://www.example.com/Services/Example.svc'へのHTTPリクエストが、割り当てられたタイムアウトを超えました。この操作に割り当てられた時間は、より長いタイムアウトの一部であった可能性があります。

コードをステップスルーしました。クライアントでGetItemsAsync()メソッドを起動しています。サービスは呼び出しを確認し、結果を作成して返します。ただし、GetChecksCompleted()メソッドがヒットすることはありません(はい、イベントハンドラーを追加しています)。数分後、エラーが発生します。

観察可能なコレクションの代わりに1つの長いコンマ/セミコロン/パイプ区切り文字列を返し、すべてが正常に実行されるようにコードを変更してみました。

ObservableCollectionが機能しないのはなぜですか?

詳細:私が得ているエラーは、returnステートメントの直前の行にある生成されたファイルReference.csで実際に発生します。

public System.Collections.ObjectModel.ObservableCollection<System.Collections.Generic.Dictionary<string, object>> EndGetItems(System.IAsyncResult result) {
                object[] _args = new object[0];
                System.Collections.ObjectModel.ObservableCollection<System.Collections.Generic.Dictionary<string, object>> _result = ((System.Collections.ObjectModel.ObservableCollection<System.Collections.Generic.Dictionary<string, object>>)(base.EndInvoke("GetItems", _args, result)));
                return _result;
            }
4

4 に答える 4

2

これは、返されるデータのサイズがサイズ制限を超えた場合に発生する可能性があると思います。すべてのリストではなく1つの要素のみを返すようにして、理由がないことを確認してください。もしそうなら-設定ファイルに必要なmaxBufferSizeを設定します。

また、web.configを投稿すると役立つ場合があります。

于 2012-05-30T08:48:03.127 に答える
1

いくつかの可能性があります:

  1. おそらく、返すにはデータが多すぎます。サーバー側にブレークポイントを設定し、そこにある行数を確認します。

  2. 実際には、ObservableCollectionを返す必要はありません。WCFはリストを返し、それをObservableCollectionに変換するのはクライアントの責任です。

クライアントのタイムアウトを変更できます。

   using System.ServiceModel.DomainServices.Client;

   /// <summary>
   /// Utility class for changing a domain context's WCF endpoint's
   /// SendTimeout. 
   /// </summary>
   public static class WcfTimeoutUtility
   {
    /// <summary>
    /// Changes the WCF endpoint SendTimeout for the specified domain
    /// context. 
    /// </summary>
    /// <param name="context">The domain context to modify.</param>
    /// <param name="sendTimeout">The new timeout value.</param>
    public static void ChangeWcfSendTimeout(DomainContext context, 
                                            TimeSpan sendTimeout)
    {
      PropertyInfo channelFactoryProperty =
        context.DomainClient.GetType().GetProperty("ChannelFactory");
      if (channelFactoryProperty == null)
      {
        throw new InvalidOperationException(
          "There is no 'ChannelFactory' property on the DomainClient.");
      }

      ChannelFactory factory = (ChannelFactory)
        channelFactoryProperty.GetValue(context.DomainClient, null);
      factory.Endpoint.Binding.SendTimeout = sendTimeout;
    }
   }

長時間実行操作のドメインコンテキストと送信タイムアウトの新しい値をChangeWcfSendTimeoutメソッドに渡すと、問題ありません。エンドポイントの使用後にバインディングを変更することはできないため、このメソッドを呼び出すのに最適な場所は、次のように、ドメインコンテキストの部分的なOnCreatedメソッドです。

namespace SampleNamespace.Web.Services
{
  public partial class MyDomainContext
  {
    partial void OnCreated()
    {
      TimeSpan tenMinutes = new TimeSpan(0, 10, 0);
      WcfTimeoutUtility.ChangeWcfSendTimeout(this, tenMinutes);
    }
  }
}

出典:Kyle McClennan [MSFT]

于 2012-05-17T06:20:49.440 に答える
0

クライアント接続を破棄する必要があると思います。接続数に制限のある接続プールがあります。すべての接続が使用されている場合、思い出したように、新しい接続を確立しようとして失敗します。チャンネルを「using」ステートメントにラップするだけです。

于 2012-05-30T06:39:07.193 に答える
0

問題は実際にはいくつかのデータにありました。一部の列にDBNull値があり、逆シリアル化中に問題が発生していました。スローされたというエラーメッセージは完全にオフでした。

http://msdn.microsoft.com/en-us/library/ms733025.aspxで概説されているように、トレースを有効にした後、何が起こっているのかを理解することができました。

私を正しい方向に導いてくれたanatoliiGに感謝します。

于 2012-05-31T15:25:19.150 に答える