1

我已经通过列表通过我的 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;
        }
    }

此外,列表中的对象几乎没有任何大小,所以请不要告诉我提高发送/接收限制/超时。

4

2 回答 2

0

它实际上也取决于结果列表中有多少元素,而不仅仅是单个元素的大小。您可以使用一些配置元素:

maxReceivedMessageSize
maxBufferSize
maxBufferPoolSize
maxArrayLength
maxStringContentLength

另一种解决方案是切换到流式 WCF 服务。请注意,您不能混合使用流式操作和缓冲操作 - 我有时会创建两个 WCF 服务,一个用于流式操作,一个用于缓冲操作。

于 2013-03-31T17:45:29.603 回答
0

仅根据您发布的代码很难给您答案,因为仅从那几个片段中复制问题是不可能的。(为此,您需要发布 ReviewModule 的完整定义、您的服务合同等)。

因此,这只是一个猜测,但是当我在端点中使用 Using 块时,我在使用 WCF 和 MVC Web Api 设置 RESTful Web 服务时被抓了几次。尽管 Using 是 C# 中的一个有价值的构造,但我发现,当您在一个方法中定义一个表示最终由您无法控制的代码调用的端点的方法时,Using 块依赖于工作的 IDisposable 接口得到弄乱。也就是说,您在您的方法中定义了一个对象(在本例中是一个名为“con”的 Context 类型的对象),只是稍后您所依赖的 WCF 框架才会尝试访问在您的端点中创建的对象. 当 WCF 框架完成其工作时,您的 Context 对象上的 Dispose() 方法可能已经被您的代码调用,这意味着 WCF 框架无法以它需要的方式访问它,以便能够返回您的服务预期的数据服务。即使您的方法在您从完全受您控制的代码中对其进行单元测试时,也可能是这种情况。

要查看这是否是您的问题,请尝试删除“GetReviewsInModule”方法/服务端点中的 Using 块,如下所示:

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

如果这导致您的端点按预期开始工作,您可以担心如何管理对象处置并避免将内存泄漏作为一个单独的问题。

于 2013-03-31T17:14:19.970 回答