【问题标题】:Why won't my WCF service return an integer?为什么我的 WCF 服务不返回整数?
【发布时间】:2012-04-06 07:41:19
【问题描述】:

我编写了一个从我的 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.ThrowMaxReceivedMessageSizeExceeded()
在 System.ServiceModel.Channels.HttpInput.GetMessageBuffer()
在 System.ServiceModel.Channels.HttpInput.ReadBufferedMessage(流 输入流)
在 System.ServiceModel.Channels.HttpInput.ParseIncomingMessage (异常& 请求异常)
在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(时间跨度超时)
在 System.ServiceModel.Channels.RequestChannel.Request(消息消息, 时间跨度超时)
在 System.ServiceModel.Dispatcher.RequestChannelBinder.Request(消息 消息,TimeSpan 超时)
在 System.ServiceModel.Channels.ServiceChannel.Call(字符串操作, Boolean oneway, ProxyOperationRuntime 操作, Object[] ins, Object[] 出局,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)
在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(消息数据& msgData, Int32 类型)
在 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; }
    }

}

【问题讨论】:

  • 你能给我们确切的错误吗?还有 Track 类。您还应该关闭阅读器。
  • 也许如果您使用 MsSql CE 数据库,您的 KeyId 不是 int 而是 GUID。然后在尝试转换为 int 时出现错误。
  • 启用wcf tracing 以查看详细的错误消息并向我们展示该错误。
  • Boom 发布错误,现在一切都清楚了 - 在端点中增加 MaxReceivedMessageSize

标签: c# wcf


【解决方案1】:

当您说“如果我取出 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" />

【讨论】:

  • 我在 web.config 中增加了 maxRecievedMessageSize。现在的问题是,当我将它发布到我的虚拟主机(www.winhost.com)时,它似乎没有生效。我会假设网络主机会使用我发布的任何 web.config 文件?
  • 那是另一个问题。我不能真正帮助你,因为我只有在赢得服务托管方面的经验,而不是 WCF 服务器的 IIS 托管方面的经验。您最好将其作为一个单独的问题发布。
  • 好的,谢谢Ricibob,我先发给winhost团队看看他们能不能回答。
  • 顺便说一句,这个问题刚刚弹出 - 它可能会帮助您(直接使用它包含的信息或回答时)stackoverflow.com/questions/10041931/…
  • 所有排序,谢谢大家...这一切都在 web.config 文件中 :)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-26
      • 2011-02-01
      • 2014-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      相关资源
      最近更新 更多