【问题标题】:WP7 WCF The underlying connection was closed: The connection was closed unexpectedlyWP7 WCF 底层连接被关闭:连接被意外关闭
【发布时间】:2012-04-26 09:53:54
【问题描述】:

由于我无法理解的原因,我开始在我的 WCF 服务中收到此错误: 底层连接已关闭:连接意外关闭。

服务器堆栈跟踪:在 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(字符串动作, Boolean oneway, ProxyOperationRuntime 操作, Object[] ins, Object[] 出局,TimeSpan 超时)在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall,ProxyOperationRuntime 操作)在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 留言)

在 [0] 处重新抛出异常:在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg)在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(消息数据& msgData,Int32 类型)在 IPublicService.GetProduct(字符串条形码)
在 PublicServiceClient.GetProduct(String 条码)

内部异常:底层连接已关闭:连接 意外关闭。在 System.Net.HttpWebRequest.GetResponse() 在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(时间跨度 超时)

服务方法如下:

public Product GetProduct(string barcode)
        {
            DataContext Db = new DataContext();
            var p = Db.Products.Find(barcode);
            if (p == null)
                return null;

            return new Product()
            {
                ProductID = p.ProductID,
                Name = p.Name,
                Nutrition = p.Nutrition,
                Allergen = p.Allergen,
                Image = p.Image,
                ManufacturerID = p.ManufacturerID,
                ReviewIDs = p.ReviewIDs
            };
        }

这是产品数据合同:

[DataContract]
    public class Product
    {
        [Key]
        [Required]
        [DataMember]
        public string ProductID { get; set; }

        [Required]
        [DataMember]
        public string Name { get; set; }

        [Required]
        [DataMember]
        public string Nutrition { get; set; }

        [Required]
        [DataMember]
        public string Allergen { get; set; }

        [Required]
        [DataMember]
        public string Image { get; set; }

        [Required]
        [DataMember]
        public virtual Manufacturer ManufacturerID { get; set; }

        [DataMember]
        public virtual ICollection<Review> ReviewIDs { get; set; }
    }

但是,如果我将服务方法更改为:

public Product GetProduct(string barcode)
        {
            DataContext Db = new DataContext();
            var p = Db.Products.Find(barcode);
            if (p == null)
                return null;

            //return new Product()
            //{
            //    ProductID = p.ProductID,
            //    Name = p.Name,
            //    Nutrition = p.Nutrition,
            //    Allergen = p.Allergen,
            //    Image = p.Image,
            //    ManufacturerID = p.ManufacturerID,
            //    ReviewIDs = p.ReviewIDs
            //};
            return new Product();
        }

没有抛出异常,它返回并清空产品,所以我不确定是什么导致了我得到的模棱两可的异常,有人能解释一下这个问题吗?

【问题讨论】:

  • 您确定没有成员违反任何 WCF 限制(最大字符串长度、最大消息大小)?
  • @Chris - 你知道这些限制是什么吗?我想图像导致失败(超时、大小等)。

标签: c# wcf windows-phone-7 .net-4.0


【解决方案1】:

一般情况下,您应该使用微软提供的Svctraceviewer.exe 来调试WCF pluming。您应该在服务端运行跟踪。

【讨论】:

    【解决方案2】:

    不幸的是,WCF 异常并不总是很有帮助,但您可能会遇到一些内置的 WCF 限制(这些限制是可调的)。默认MaxReceivedMessageSize 是 64kb,我认为默认的最大字符串长度是 8kb。尝试增加这些限制应该可以解决您的问题。

    【讨论】:

    • 是的,评论列表太大了……我不得不将它们实现为一个单独的 API 函数,一次返回 10 个。
    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多