我遇到了一个问题,试图返回一个包含子对象集合的对象,这些对象又可以容纳一组孙对象。我收到一个错误,'连接被主机强行关闭'。
有没有办法让这项工作?我目前的结构类似于:
伪代码:
Person:
IEnumerable<Order>
Order:
IEnumerable<OrderLine>
所有三个对象都具有DataContract属性,我想要公开的所有公共属性(包括IEnumerable)都具有DataMember属性。
我的服务上有多个OperationContract,所有返回单个对象的方法或IEnumerable对象都可以正常工作。只有当我尝试嵌套IEnumerable时才会变坏。同样在我的客户服务参考中,我选择了通用列表作为我的集合类型。我只想强调,我的操作/方法中只有一个因此错误而失败 - 其余部分完美无缺。
编辑(更详细的错误说明):
[SocketException (0x2746): An existing connection was forcibly closed by
the remote host]
[IOException: Unable to read data from the transport connection:
An existing connection was forcibly closed by the remote host.]
[WebException: The underlying connection was closed: An unexpected
error occurred on a receive.]
[CommunicationException: An error occurred while receiving the HTTP
response to http://myservice.mydomain.dk/MyService.svc. This could
be due to the service endpoint binding not using the HTTP protocol.
This could also be due to an HTTP request context being aborted by
the server (possibly due to the service shutting down). See server
logs for more details.]
我尝试查找日志但我找不到任何...我也在使用WSHttpBinding和http端点。
答案 0 :(得分:38)
请注意,您需要了解如何使用WCF日志记录实用程序:
Config Editor(快速设置)。
Trace viewer.非常棒。允许多个服务(客户端和服务器)跟踪并可以加入它们并帮助您分析所有详细信息。让您快速找到问题的根源。 (因为当出现服务器WCF错误时,客户端不太可能获得有用的数据。)
答案 1 :(得分:11)
好的,我终于在我的案例中找到了真正的问题。看来露出枚举并不是世界上最伟大的事情。我要么必须在它们上设置一个默认值,要么将该属性公开为int或我的枚举基于的任何整数类型。
感谢您的帮助,您无法知道这一点 - 我在我的结构中找到了第3级的枚举,并逐个系统地删除了数据库,这是我发现的方式。看来我不是唯一一个遇到这个问题的人 - 这家伙显然遇到了类似的问题:)
答案 2 :(得分:10)
如果您正在使用WCF +(EF + POCO),请尝试设置,
ObjectContext.ContextOptions.LazyLoadingEnabled = false;
ObjectContext.ContextOptions.ProxyCreationEnabled = false;
答案 3 :(得分:3)
将此行添加到<system.web/>
:
<httpRuntime maxRequestLength="102400" executionTimeout="3600" />
答案 4 :(得分:3)
枚举获得DataContract
属性,就像任何类一样,但枚举值不应该有DataMember
属性。
将它们更改为EnumMember
,您将不再收到此难以理解的错误。
答案 5 :(得分:1)
这实际上与您的第一个异常描述相同。它会影响到socketexception的最初原因。它必须是服务本身的某种错误。你能找到whar异常发生的地方吗?
当我试图返回被NHibernate覆盖的正常IEnumebles(它们被标记为虚拟)时,我有类似的错误,并且用GenericPersistentBag替换,这是不可序列化的。 你有没有将IEnumerable数据库标记为虚拟,因为nhibernate或类似的东西?这可以解释你的错误。顺便说一句。 wcf异常通常是毫无意义的(在追踪错误时可能非常令人沮丧;)
答案 6 :(得分:1)
我也有同样的问题(.Net 3.5)。结果我的基类DataContract
缺少一个已知的类型。不幸的是,WCF错误不是更具描述性。
答案 7 :(得分:0)
您是否在服务行为配置中指定了?看起来这个堆栈跟踪中缺少一些信息。
可以在服务器端获取异常(例如,在visual studio调试模式下或使用log4net等日志库)。
您是否尝试在同一服务上调用其他一些方法(例如简单的helloworld())以确保服务配置本身有效? 这种exceptino也可能表明一些序列化问题。你想通过电线发送什么类型的?你在某处使用KnownType吗?
答案 8 :(得分:0)
Server Error in '/' Application.
--------------------------------------------------------------------------------
An existing connection was forcibly closed by the remote host
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[SocketException (0x2746): An existing connection was forcibly closed by the remote host]
System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) +93
System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) +119
[IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.]
System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) +267
System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size) +25
System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead) +306
[WebException: The underlying connection was closed: An unexpected error occurred on a receive.]
System.Net.HttpWebRequest.GetResponse() +1532114
System.ServiceModel.Channels.HttpChannelRequest.WaitForReply(TimeSpan timeout) +40
[CommunicationException: An error occurred while receiving the HTTP response to http://Zzzstrukturservice.xxx.dk/ZzzstrukturService.svc. This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details.]
System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +2668969
System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) +717
xxx.Services.ZzzstrukturServiceClient.ZzzstrukturServiceProxy.IZzzstrukturService.GetMatrixSet(Int32 matrixSetId) +0
xxx.Services.ZzzstrukturServiceClient.ZzzstrukturRepository.GetMatrixSetById(Int32 matrixSetId) in f:\ccnet\work\xxx.Zzzstruktur\1. Presentation Layer\ZzzstrukturServiceClient\ZzzstrukturRepository.cs:90
xxx.yyy.yyyWeb.AnnoncePage.OnLoad(EventArgs e) in f:\ccnet\work\yyyV2\1. Presentation Layer\yyyWeb\Annonce.aspx.cs:40
System.Web.UI.Control.LoadRecursive() +47
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436
--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.1433; ASP.NET Version:2.0.50727.1433
答案 9 :(得分:0)
我不知道为什么会发生这种情况。但我也有类似的问题。
我更改了我的枚举。删除了索引(例如ASNOrder = 1, - &gt; ASNOrder),并且没有出现错误。
答案 10 :(得分:0)
不要在合同中返回文字IEnumerable
,有着名的WCF IEnumerable bug
答案 11 :(得分:0)
是的,我在这里遇到了同样的问题,并且它返回了包含枚举值的对象。将DataMember
更改为int并将所有内容设置为有效。
答案 12 :(得分:0)
尝试在接口方法实现之上设置[OperationBehavior()]
。
答案 13 :(得分:0)
使用'yield return'构建映射到DataContract
类型的对象的枚举时,我遇到了这个错误。
在收益结果上调用ToList
/ ToArray
修复了问题并且服务调用正常工作。