C# WCF可以很好地返回单个对象,但在返回列表时失败

C# WCF可以很好地返回单个对象,但在返回列表时失败,c#,.net,wcf,web-services,web,C#,.net,Wcf,Web Services,Web,我已经通过我的WCF服务通过列表发送了各种其他对象,没有任何问题,但是当我尝试在我得到的列表中发送这个特定对象时,有点超时错误 跟踪标识符为: 示踪器 奇怪的是:我得到了另一个方法,它只返回不在列表中的对象,并且工作正常 此外,在调试时,我发现服务端的方法返回的列表很好,但显然是客户端接收不到列表 下面是调用服务的方法,它在声明revs的行中失败: public void GetReviewsInModule() { using (var db = new

我已经通过我的WCF服务通过列表发送了各种其他对象,没有任何问题,但是当我尝试在我得到的列表中发送这个特定对象时,有点超时错误

跟踪标识符为: 示踪器

奇怪的是:我得到了另一个方法,它只返回不在列表中的对象,并且工作正常

此外,在调试时,我发现服务端的方法返回的列表很好,但显然是客户端接收不到列表

下面是调用服务的方法,它在声明revs的行中失败:

public void GetReviewsInModule()
        {
            using (var db = new RentItServiceClient())
            {
                var revs = db.GetReviewsInModule(1);
            }
        }
下面是一个方法,该方法实际返回object作为一个列表,并对其进行了调试,返回结果良好:

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和mvcwebapi来设置restfulweb服务时,有几次我被发现了。虽然Using在C中是一个很有价值的构造,但我发现,当您在一个方法中定义了一个表示最终由您不控制的代码调用的端点时,Using块所依赖的IDisposable接口就会变得混乱。也就是说,您在方法中定义了一个对象,在本例中是一个名为con的Context类型的对象,您所依赖的WCF框架只是在稍后才尝试访问在端点中创建的对象。当WCF框架完成其工作时,您的代码可能已经调用了上下文对象上的Dispose方法,这意味着WCF框架无法以需要的方式访问它,以便能够返回您的服务要提供的数据。当您从完全在您控制下的代码中进行单元测试时,即使您的方法是独立工作的,也可能会出现这种情况

要查看这是否是您的问题所在,请尝试删除GetReviewInModule方法/服务端点中的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;
}

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

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

maxReceivedMessageSize
maxBufferSize
maxBufferPoolSize
maxArrayLength
maxStringContentLength

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

我很久以前就放弃了SOAP,转而使用REST,只是移动了一个json对象—使用SOAP服务有什么具体原因吗?另外,检查WSDL,看看是否有对象在那里,或者至少有一个链接在那里-您正在寻找一个xsd,因为SOAP使用XML,该链接指向msdn的丹麦变种,并且不起作用。哈?列表被创建,上下文对象被释放,列表被序列化并返回给客户机,应该是什么问题?我只是说我所看到的,并在面对不允许读者复制问题的模糊问题描述时提出问题的可能原因。WCF和MVCWebAPI框架有时在使用用户定义代码中的块访问中定义的对象时遇到问题。这两个框架都因没有报告问题所在而感到内疚。我知道你在做什么,我只是问这是否有意义。using块只是在执行离开块时对对象调用Dispose的简写。在这种情况下,由于revs对象在发生这种情况时被初始化,Dispose调用将如何导致超时?PS:您提到的序列化只会在稍后的WCF框架内发生。不在端点本身内。WCF框架需要能够访问上面代码中revs变量引用的List类型的对象,才能序列化结果。这就是我所看到的问题中出现问题的地方。当/如果OP尝试建议的方法时,他肯定会知道这是否是他案例中的问题。事实上,该方法生成的列表很好,但是调用方法没有正确地接收到它。即使列表中只有1个元素,它也会失败。此外,我们已经在使用流式Wcf。否则,您的服务必须返回流,而不是列表,因为流式服务只能返回流 并以流为参数。