1

SQL Server データベースからデータを読み取る WCF サービスを作成しました。すべての文字列を返すメソッドを呼び出すと正常に動作しますが、int を返すメソッドを呼び出すと、タイムアウトとデータが多すぎるというエラーでクラッシュします。これは意味がありません...

これが私のWebサービスコードです:

public List<Track> getTrack()
{
    List<Track> trackList = new List<Track>();

    SqlConnection dbConn = connectToDb();

    string _selectQuery = string.Format("SELECT Date, Track, KeyID FROM hdData ORDER BY Track");

    try
    {
        dbConn.Open();
        SqlCommand cmd = new SqlCommand(_selectQuery, dbConn);
        SqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            Track Dat = new Track();
            Dat.Date = (string)reader[0];
            Dat.TrackName = (string)reader[1];
            Dat.KeyId = (int)reader[2];
            trackList.Add(Dat);
        }

        dbConn.Close();
     }
     catch (Exception e)
     {
        Console.WriteLine(e.ToString());
     }

     return trackList;
  }

フィールドを取り出すと正常にKeyId動作します...KeyIdデータベースではタイプとして定義されてintおり、自動インクリメントフィールドです。

私はそれをキャストしようとしましたvarcharが、同じ結果になりました...

私は何を間違っていますか?

よろしく、ディーン

正確なエラーと Track クラスは次のとおりです。

OK、正確なエラーは次のとおりです。

受信メッセージの最大メッセージ サイズ クォータ (65536) を超えました。クォータを増やすには、適切なバインド要素で MaxReceivedMessageSize プロパティを使用します。

サーバー スタック トレース:
System.ServiceModel.Channels.HttpInput.ThrowMaxReceivedMessageSizeExceeded()
で System.ServiceModel.Channels.HttpInput.GetMessageBuffer()
で System.ServiceModel.Channels.HttpInput.ReadBufferedMessage(ストリーム inputStream)
で System.ServiceModel.Channels.HttpInput
System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan タイムアウト)での.ParseIncomingMessage(Exception& requestException)
System.ServiceModel.Channels.RequestChannel.Request(メッセージ メッセージ、TimeSpan タイムアウト)
で System.ServiceModel.Dispatcher.RequestChannelBinder. Request(メッセージ メッセージ、TimeSpan タイムアウト)
System.ServiceModel.Channels.ServiceChannel.Call (文字列アクション、Boolean oneway、ProxyOperationRuntime 操作、Object[] ins、Object[] outs、TimeSpan タイムアウト)
で System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (IMethodCallMessage methodCall、ProxyOperationRuntime 操作)
System.ServiceModel.Channels.ServiceChannelProxy.Invoke (IMessage メッセージ) で

[0] で例外が再スローされました: System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (
IMessage reqMsg, IMessage retMsg)

)
Service1Client.getTrack() で

内部例外:
受信メッセージの最大メッセージ サイズ クォータ (65536) を超えました。クォータを増やすには、適切なバインド要素で MaxReceivedMessageSize プロパティを使用します。

Track クラスは次のとおりです。

[DataContract]
public class Track
{
    string _Date, _TrackName;
    int _KeyId;

    [DataMember]
    public string Date
    {
        get { return _Date; }
        set { _Date = value; }
    }

    [DataMember]
    public string TrackName
    {
        get { return _TrackName; }
        set { _TrackName = value; }
    }

    [DataMember]
    public int KeyId
    {
        get { return _KeyId; }
        set { _KeyId = value; }
    }

}
4

3 に答える 3

2

「KeyId フィールドを取り出すと」と言うのは、Track クラスから削除するということですか? その場合、返される追跡リストのサイズがエンドポイント バインディングの MaxReceivedMessageSize (65536) に近い可能性はありますか? このような場合、Track クラスから _KeyId int を削除して List のサイズを小さくすると、返されるデータ サイズ全体がこの制限を下回る可能性があります。
エンド ポイント バインディングでこの制限を増やしてみてください。サーバーとクライアントの両方でこれを行う必要がある場合があります。例えば:

 maxBufferPoolSize="10000000" maxBufferSize="10000000" maxReceivedMessageSize="10000000">
    <readerQuotas maxDepth="32"
        maxStringContentLength="10000000" maxArrayLength="10000000"
        maxBytesPerRead="10000000" maxNameTableCharCount="10000000" />
于 2012-04-06T08:31:38.360 に答える
0

クォータエラーを予期していたので、正確なエラーメッセージを尋ねました。

このリンクを注意深くお読みください: http ://www.aspnet101.com/2010/08/wcf-performance-best-practices/ 特にクォータの部分(ただし、記事全体がWCFをよりよく理解するのに役立つと思います) 。

次に、クライアント側でもこれらの設定(クォータ)を変更する必要があることを忘れないでください(つまり、サーバーを更新したらWeb参照を更新します)

于 2012-04-06T09:51:05.573 に答える