1

我编写了一个从我的 SQL Server 数据库中读取数据的 WCF 服务。当调用一个返回所有字符串的方法时它工作正常,但是如果我调用一个返回一个 int 的方法,它会崩溃并出现一些关于超时和太多数据的错误,这对我来说没有意义......

这是我的网络服务代码:

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类如下:

好的,确切的错误是:

已超出传入邮件 (65536) 的最大邮件大小配额。要增加配额,请在适当的绑定元素上使用 MaxReceivedMessageSize 属性。

服务器堆栈跟踪:
在 System.ServiceModel.Channels.HttpInput.GetMessageBuffer(
)
在 System.ServiceModel.Channels.HttpInput.ReadBufferedMessage(Stream inputStream)
在 System.ServiceModel.Channels.HttpInput的 System.ServiceModel.Channels.HttpInput.ThrowMaxReceivedMessageSizeExceeded() .ParseIncomingMessage(Exception& requestException)
在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
在 System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
在 System.ServiceModel.Dispatcher.RequestChannelBinder。请求(消息消息,TimeSpan 超时)
在 System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 消息)

在 [0] 处重新抛出异常:

System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
在 IService1.getTrack( )
在 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 类中删除吗?如果是这样,您返回的 Track 列表的大小是否可能接近您的端点绑定 MaxReceivedMessageSize (65536)?如果是这种情况,那么通过从 Track 类中删除 _KeyId int 来减小该列表的大小可能会将返回的总体数据大小减小到此限制以下。
尝试在端点绑定中增加此限制。您可能需要为服务器和客户端执行此操作。例如:

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

基本上,您需要增加消息的大小。为此,您需要为您正在使用的任何绑定创建一个绑定配置- 我在basicHttpBinding这里用作示例。因此,您需要定义绑定配置(在您的服务器和客户端的配置中),并且您的服务以及您的客户端需要引用该绑定配置:

<system.serviceModel>
  <bindings>
    <!-- use whichever binding you're using here! -->
    <basicHttpBinding>
      <!-- define a binding configuration with a name -->
      <binding name="LargeData"
               maxBufferSize="999999" maxReceivedMessageSize="999999" />
    </basicHttpBinding>
  </bindings>
  <services>
    <service name="Namespace.YourServiceClass">
      <!-- your endpoints - both on the server as well as on the client - need
           to make reference to that defined binding configuration -->
      <endpoint name="test"
                address="...."
                binding="basicHttpBinding"
                bindingConfiguration="LargeData"
                contract="Namespace.IYourServiceContract" />
    </service>
  </services>
</system.serviceModel>

在客户端,您将拥有以下内容:

   <client name="....">
        <endpoint name="test"
            address="...."
            binding="basicHttpBinding"
            bindingConfiguration="LargeData"
            contract="Namespace.IYourServiceContract" />
   </client>   
于 2012-04-06T08:36:59.353 回答
0

我期待一个配额错误,这就是为什么我问你确切的错误信息。

请仔细阅读此链接: http ://www.aspnet101.com/2010/08/wcf-performance-best-practices/ 特别是配额部分(但我认为整篇文章将帮助您更好地了解 WCF) .

Then, don't forget that you have to change these settings (Quota) also on the client side (i.e. refresh web reference once you've updated the server)

于 2012-04-06T09:51:05.573 回答