在对底层数据库和实体进行微小更改后,WCF Web-Service崩溃

本文关键字:崩溃 Web-Service WCF 数据库 实体 | 更新日期: 2023-09-27 18:03:51

这个问题我已经想了很久了,如果你能帮我的话,我真的很感激。

我正在用ASP.NET写一个网站。业务层分为两个部分:BL-Server和BL-Client。数据库服务器实际上是一个wcf服务,它在那里保护数据访问层和数据库。WCF-Service连接到DAL,然后从DB中读取数据。我们正在使用MSSQL

问题开始于对DB的一个表做了一个小的改变(向表"Responses"添加一个bool列)。

突然,每次我通过WCF-Service请求信息,我得到以下异常:"System.ServiceModel。CommunicationException未被用户代码处理Message=The underlying connection was closed:连接被意外关闭。"

这有点奇怪,因为即使我从另一个表(如"Departments")请求数据,也会发生错误。

我做了一些挖掘,并在设置跟踪WCF-Service(参见:http://forums.asp.net/t/1476129.aspx/1)之后,我发现WCF-Service中导致它突然关闭连接的问题是缓冲区溢出。当尝试将对象加载到返回缓冲区时,该服务抛出以下异常:"使用递归结构编写对象在深度较大时具有局限性。考虑降低物体的深度。"

这导致我在加载"Departments"数据并检查即将通过wcf服务发送的对象的DAL方法中设置了一个断点。

对象中有一些循环。你可以在无限循环中遍历它的元素,因为"Departments"有一些指向他的子元素。

这对我来说似乎很奇怪,所以我检查了.dbml文件,一个墙-"部门"有一个指向它的实体列表。我发现,这可以在链接(两个实体之间,在.dbml文件中)的属性中启用/禁用。该属性称为"Child property",当启用时,会将具有外键的对象列表添加到元素中。(例如:如果A从FK到B,则B元素将具有以下成员:private EntitySet<A> _A;)

在这一点上,有人可能会认为解决方案是将实体之间所有链接的所有"子属性"设置为false。但最终会出现其他例外情况,例如:"System.Data.Linq。ForeignKeyReferenceAlreadyHasValueException未被用户代码处理消息=由于对象的当前状态,操作无效。"(由实体抛出).

此外,我不想弄乱.dbml文件。我知道在对"Responses"表进行微小更改之前一切都很好,我发现很难相信一个表的微小更改会导致实体代码中的如此多混乱。

我很抱歉写了这么长一篇文章,但这个问题让我发疯了,我想确保我给出了所有相关的信息。

注意:应用程序的结构是一个先决条件,我不能改变它,所以我们不要讨论这个。

提前感谢,SummerBulb

更新:因为我使用的是源代码控制,所以我能够比较旧的"businessselements .designer.cs"和新的。我发现旧文件包含许多处理序列化的代码。例如:[global::System.Runtime.Serialization.DataMemberAttribute(Order=1)],添加到所有属性(getter和setter)的属性。

这段代码是否因为新的布尔值而被删除?我怎样才能得到序列化支持代码?

在对底层数据库和实体进行微小更改后,WCF Web-Service崩溃

解决!

显示"Serialization mode"属性被设置为"none"。我把它设置为"单向",现在一切都好了。

如果你也遇到了同样的问题,并且觉得这篇文章很有帮助,请留言告诉我。

谢谢!

看一下这篇文章,它可能会帮助您了解为什么/何时添加(或删除)特定属性

另一件要检查的事情是你是否还在使用相同版本的实体框架