WCF可以很好地返回单个对象,但在返回列表时失败
本文关键字:返回 列表 失败 单个 很好 WCF 对象 | 更新日期: 2023-09-27 18:06:57
我已经通过列表在我的WCF服务上发送了各种其他对象,没有任何问题,但是当我尝试发送这个特定对象(在列表中)时,我得到了超时错误。
跟踪标识符为:TraceIdentifier http://msdn.microsoft.com/da-DK/library/System.ServiceModel.Diagnostics.TraceTruncatedQuotaExceeded.aspx
奇怪的是:我得到了另一个方法,它只返回对象(不是在列表中),它工作得很好。
此外,在调试时,我发现该方法(在服务端)返回列表很好,但显然是客户端无法接收它。
下面是调用服务的方法(它在声明"revs"的那行失败):
public void GetReviewsInModule()
{
using (var db = new RentItServiceClient())
{
var revs = db.GetReviewsInModule(1);
}
}
下面是实际返回对象列表的方法(调试它,它返回的很好):
public List<ReviewModule> GetReviewsInModule(int id)
{
using (Context con = new Context())
{
con.Configuration.ProxyCreationEnabled = false;
var mod = con.Modules.Find(id);
if (mod == null)
throw new WebServiceValidationException("Object does not exist");
List<ReviewModule> revs = con.ModuleReviews.Include("User").Where(r => r.Module.Id == id).ToList();
return revs;
}
}
此外,列表中的对象几乎没有任何大小,所以请不要告诉我提高发送/接收限制/超时
仅根据您发布的代码很难给您一个答案,因为不可能仅从这几个代码片段复制问题。(为此,你需要发布ReviewModule的完整定义、你的服务契约等)。
因此这只是一个猜测,但是当我在端点内使用using块时,使用WCF和MVC Web Api来设置RESTful Web服务时,我已经被抓住了几次。尽管Using在c#中是一个有价值的构造,但我发现,当您在一个方法中定义了一个构造,该方法表示最终由您无法控制的代码调用的端点时,那么Using块所依赖的IDisposable接口就会变得混乱。也就是说,您在方法中定义了一个对象(在本例中是名为"con"的Context类型的对象),只是在稍后,您所依赖的WCF框架才会尝试访问在端点中创建的对象。当WCF框架完成它的工作时,Context对象上的Dispose()方法可能已经被你的代码调用了,这意味着WCF框架不能以它需要的方式访问它,以便能够返回你的服务打算提供的数据。即使您的方法在与完全在您控制之下的代码进行单元测试时独立工作,也可能出现这种情况。
看看在你的情况下,如果这是问题,尝试删除Using块在你的"GetReviewsInModule"方法/服务端点,像这样:
public List<ReviewModule> GetReviewsInModule(int id)
{
Context con = new Context();
con.Configuration.ProxyCreationEnabled = false;
var mod = con.Modules.Find(id);
if (mod == null) throw new WebServiceValidationException("Object does not exist");
List<ReviewModule> revs = con.ModuleReviews.Include("User").Where(r => r.Module.Id == id).ToList();
return revs;
}
如果这导致您的端点开始按预期工作,您可以担心如何管理对象处置和避免内存泄漏作为一个单独的问题。
这实际上也取决于结果列表中有多少元素,而不仅仅取决于单个元素的大小。这里有一些你可以使用的配置元素:
maxReceivedMessageSize
maxBufferSize
maxBufferPoolSize
maxArrayLength
maxStringContentLength
另一个解决方案是切换到流式WCF服务。请注意,你不能混合流操作和缓冲操作——我有时会创建两个WCF服务,一个用于流操作,一个用于缓冲操作。