我编写了一个从我的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(Stream 的inputStream)
在System.ServiceModel.Channels.HttpInput.ParseIncomingMessage(Exception&amp; requestException)
在System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
在System.ServiceModel.Channels.RequestChannel.Request(消息消息, TimeSpan超时)
在System.ServiceModel.Dispatcher.RequestChannelBinder.Request(消息 消息,TimeSpan超时)
在System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway,ProxyOperationRuntime操作,Object [] ins, 对象[]出局,TimeSpan超时)
在System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage) methodCall,ProxyOperationRuntime operation)
在System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 消息)在[0]处重新抛出异常:
在System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg)
在System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&amp; 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; }
}
}
答案 0 :(得分:2)
当你说“如果我取出KeyId字段”时,你的意思是从Track类中删除吗?如果是这样,您返回的Track列表的大小可能接近端点绑定MaxReceivedMessageSize(65536)?如果是这种情况,那么通过从Track类中删除_KeyId int来减小该List的大小可能会将总返回数据大小减小到此限制以下。
尝试在终点绑定中增加此限制。您可能需要为服务器和客户端执行此操作。例如:
maxBufferPoolSize="10000000" maxBufferSize="10000000" maxReceivedMessageSize="10000000">
<readerQuotas maxDepth="32"
maxStringContentLength="10000000" maxArrayLength="10000000"
maxBytesPerRead="10000000" maxNameTableCharCount="10000000" />
答案 1 :(得分: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>
答案 2 :(得分:0)
我原本期待配额错误,这就是我问你确切错误信息的原因。
请仔细阅读此链接:http://www.aspnet101.com/2010/08/wcf-performance-best-practices/ 特别是配额部分(但我认为整篇文章将帮助您更好地了解WCF)。
然后,不要忘记您还必须在客户端更改这些设置(配额)(即更新服务器后刷新Web引用)