【问题标题】:I need help solving a rather weird error in a WCF service我需要帮助解决 WCF 服务中一个相当奇怪的错误
【发布时间】:2011-02-01 18:56:49
【问题描述】:

我有一个包含三个项目的解决方案。 我的 MVC 应用程序、silverlight 应用程序和(启用了silverlight 的)WCF 服务项目的主项目。

在我的 silverlight 项目中,我对我的 WCF 服务进行了服务引用。 我几乎可以正常工作。

在我的 WCF 服务中,我有一个返回 Book 对象的方法,它有一些随机字段,如标题、日期等。 在 book 类中,我有一个包含事件列表的 ICollection 字段。

书类使用实体框架4.0生成,开启延迟加载。

如果我在我的 getBook(int id) 方法中返回一本未初始化事件字段的书,它就像一个魅力。

但如果我初始化该字段,我会收到此错误。

The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.

我对为什么会发生这种情况有一些想法,而在写这篇文章时,我又想到了一个。

  1. wcf 服务以某种方式丢弃了对事件类的引用。 这会很奇怪,因为我在我的主 mvc 应用程序(带有模型)和我的 WCF 服务之间有一个引用。

  2. 由于我在 EF 4.0 中启用了延迟加载,我怀疑它可能是产生错误的原因。 但我不确定为什么会这样,因为我没有以任何方式访问该字段。我可以理解,在我的 silverlight 应用程序中接收对象后,我可能无法访问 events 字段,因为 book 对象和实体框架之间的连接就像断开了一样。

我是否提到在我的 EF 实例上启用了延迟加载? 并且抛出的异常没有内部异常。

编辑: 这是(我认为)服务器上的例外。


底层连接已关闭:连接意外关闭。

服务器堆栈跟踪: 在 System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException,HttpWebRequest 请求,HttpAbortReason abortReason) 在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(时间跨度超时) 在 System.ServiceModel.Channels.RequestChannel.Request(消息消息,TimeSpan 超时) 在 System.ServiceModel.Dispatcher.RequestChannelBinder.Request(消息消息,TimeSpan 超时) 在 System.ServiceModel.Channels.ServiceChannel.Call(字符串操作,布尔单向,ProxyOperationRuntime 操作,Object[] 输入,Object[] 输出,TimeSpan 超时) 在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage 方法调用,ProxyOperationRuntime 操作) 在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 消息)

在 [0] 处重新抛出异常: 在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg) 在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData,Int32 类型) 在 RemoteProvider.getTimeline(Int32 id) 在 RemoteProviderClient.getTimeline(Int32 id)

内部异常: 基础连接已关闭:连接意外关闭。 在 System.Net.HttpWebRequest.GetResponse() 在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan 超时)


提前致谢。 马耳他巴登汉森

【问题讨论】:

  • 请提供服务代码。您需要检查 server 上发生的异常,当您看到此情况时查看 client 异常无济于事。
  • 在 vs 中调试时,我只收到上述异常。我不太确定如何访问服务器上发生的异常。

标签: .net asp.net-mvc wcf entity-framework exception


【解决方案1】:

如果没有关于你的实际结构的更多信息,我只能冒险猜测,但猜测是这样的:

ICollection

那是你的问题。如果没有大量内部争吵,您就无法通过 WCF 线路传递接口;如此之多,以至于我更喜欢​​只构建非功能性传输对象,其唯一工作是包含数据。

将您的 ICollection 转换为列表或数组,您可能会没事的。

反序列化传入数据时出现问题。该框架试图实例化一个接口,但它不能这样做,所以它会失败。 attributes 允许您将接口映射到 WCF 可以实例化的具体类型,但它们晦涩难懂且难以 (IMO) 以可维护的方式使用。

【讨论】:

  • 是的,将 ICollection 更改为 List 完全解决了问题 :) 现在我只需要弄清楚我将如何在我的应用程序中有效地解决问题.. :P 谢谢!
【解决方案2】:

这可能是一个序列化问题。

可能是 ICollection 无法序列化,或者您的事件对象未标记为可序列化。修复它:

  • 使用列表而不是 ICollection
  • 将事件标记为可序列化

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多