为什么我的 WCF 服务不返回整数

本文关键字:返回 整数 服务 我的 WCF 为什么 | 更新日期: 2023-09-27 18:30:26

我编写了一个从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但相同的结果......

我做错了什么?

问候院长

确切的错误和跟踪类如下所示:

好的,确切的错误是:

传入邮件的最大邮件大小配额 (65536) 为 超过。若要增加配额,请使用最大接收消息大小 相应绑定元素的属性。

服务器堆栈跟踪:
at System.ServiceModel.Channels.HttpInput.ThrowMaxReceivedMessageSizeExceeded()
at System.ServiceModel.Channels.HttpInput.GetMessageBuffer()
at System.ServiceModel.Channels.HttpInput.ReadBufferedMessage(Stream 输入流)
at System.ServiceModel.Channels.HttpInput.ParseIncomingMessage(Exception& 请求异常)
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
at System.ServiceModel.Channels.RequestChannel.Request(Message message, 时间跨度超时)
at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message 消息,时间跨度超时)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, 布尔单向, ProxyOperationRuntime operation, Object[] ins, 对象[] outs,TimeSpan 超时)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage 方法调用,代理操作运行时操作)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 消息)

在 [0] 处重新引发异常:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData,Int32 类型)
at IService1.getTrack()
at Service1Client.getTrack()

内部异常:
传入邮件的最大邮件大小配额 (65536) 已超出。若要增加配额,请使用 相应绑定元素上的 MaxReceivedMessageSize 属性。

轨道类是:

[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; }
    }
}

为什么我的 WCF 服务不返回整数

当你说"如果我去掉KeyId字段"时,你的意思是从跟踪类中删除吗?如果是这样,您返回的跟踪列表的大小是否可能接近终结点绑定 MaxReceivedMessageSize (65536)? 如果是这种情况,则通过从 Track 类中删除 _KeyId int 来减小该 List 的大小可能会将返回的总数据大小减少到此限制以下。
尝试在端点绑定中增加此限制。 您可能需要为服务器和客户端执行此操作。例如:

 maxBufferPoolSize="10000000" maxBufferSize="10000000" maxReceivedMessageSize="10000000">
    <readerQuotas maxDepth="32"
        maxStringContentLength="10000000" maxArrayLength="10000000"
        maxBytesPerRead="10000000" maxNameTableCharCount="10000000" />

基本上,您需要增加消息的大小。为此,您需要为正在使用的任何绑定创建绑定配置 - 我在此处使用 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>   

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

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

然后,不要忘记您还必须在客户端更改这些设置(配额)(即在更新服务器后刷新 Web 引用)