WCF可以返回一个对象就好了,但无法返回一个列表时(WCF can return single ob

2019-09-26 10:39发布

我已经没有任何问题,但是当我尝试发送此特定对象(名单)我得到的,有点超时错误通过列表发送其它各种物体在我的WCF服务。

跟踪标识符是:TraceIdentifier http://msdn.microsoft.com/da-DK/library/System.ServiceModel.Diagnostics.TraceTruncatedQuotaExceeded.aspx

奇怪的是:我得到了完全返回对象(而不是在一个列表)的另一种方法,它工作正常。

此外调试时,我发现了该方法(在服务端)返回列表就好了但是它是显然失败了接受它的客户端。

下面是调用服务(它无法上线,宣布“转速”)的方法:

public void GetReviewsInModule()
        {
            using (var db = new RentItServiceClient())
            {
                var revs = db.GetReviewsInModule(1);
            }
        }

下面是实际返回objectas一个列表的方法(调试它,它精细返回它):

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

此外,在列表中的对象几乎没有任何尺寸的,所以请不要告诉我到了发送/接收限制/超时。

Answer 1:

很难给你仅仅基于你已经发布的代码的答案,因为这是不可能的,只是那些少数片段重现问题。 (你需要发布ReviewModule,服务合同等的完整定义,对于)。

因此,这只是一个猜测,但使用WCF和MVC的Web API时,当我使用的端点内使用块来设定RESTful Web服务我已经抓出几十倍。 虽然使用是C#中的有价值的结构,我发现,当你有一个这么表示最终的代码你不控制,那么IDisposable接口称为端点Using块依赖于工作得到了方法中定义弄乱。 也就是说,你定义对象的方法中(在这种情况下,命名为“骗子”式上下文的对象),而且你在尝试依靠WCF框架来访问您的端点中创建的对象,这只是以后。 通过WCF框架,它的工作的时候,你的上下文对象的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;
}

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



Answer 2:

这真的取决于有多少元素在结果列表中,也不仅对单个元素的大小。 还有,你可以玩一些配置元素:

maxReceivedMessageSize
maxBufferSize
maxBufferPoolSize
maxArrayLength
maxStringContentLength

另一个解决方案是切换到流WCF服务。 请注意,你不能混用流和缓冲操作 - 我有时竟创建两个WCF服务,一个用于数据流操作,一个用于缓冲的操作。



文章来源: WCF can return single object just fine but fails when returning a list