当前位置:  开发笔记 > 编程语言 > 正文

常见的WCF异常:连接意外关闭

如何解决《常见的WCF异常:连接意外关闭》经验,为你挑选了3个好方法。

我有三个项目.一个是WCF服务项目,一个是WPF项目,一个是Microsoft单元测试项目.我使用如下所示的数据对象设置WCF服务项目:

[DataContract]
public enum Priority
{
    Low,
    Medium,
    High
}

[DataContract]
public struct TimeInfo
{
    [DataMember]
    public Int16 EstimatedHours { get; set; }

    [DataMember]
    public Int16 ActualHours { get; set; }

    [DataMember]
    public DateTime StartDate { get; set; }

    [DataMember]
    public DateTime EndDate { get; set; }

    [DataMember]
    public DateTime CompletionDate { get; set; }
}

[DataContract]
public class Task
{
    [DataMember]
    public string Title { get; set; }

    [DataMember]
    public string Description { get; set; }

    [DataMember]
    public Priority Priority { get; set; }

    [DataMember]
    public TimeInfo TimeInformation { get; set; }

    [DataMember]
    public Decimal Cost { get; set; }
}

我的合同如下:

[ServiceContract]
public interface ITaskManagement
{
    [OperationContract]
    List GetTasks();

    [OperationContract]
    void CreateTask(Task taskToCreate);

    [OperationContract]
    void UpdateTask(Task taskToCreate);

    [OperationContract]
    void DeleteTask(Task taskToDelete);
}

当我尝试使用此代码在WPF应用程序或单元测试项目中使用该服务时:

var client = new TaskManagementClient();

textBox1.Text = client.GetTasks().ToString();

client.Close();

我收到以下错误:"基础连接已关闭:连接意外关闭."

WPF和单元测试项目的app.config如下所示:


    
        
            
                
                
                
                    
                    
                
            
        
    
    
        
            
                
            
        
    

并且WCF服务的web.config如下所示:

    
    
        
            
                
                
            
            
                
                
            
        
    
    
        
            
                
                    
                
            
            
        
        
            
                
                    
                
            
            
        
    

这不是第一次发生这种情况,我猜这是一个配置问题.但每次我通常只是吹走我的服务并把它放回去或创建一个新的服务项目.然后一切都很美妙.如果有人有任何想法,那将是非常棒的.谢谢.

**

更新:我已添加评论,以便更多地解决此问题.当答案可用时,如果答案未发布,我会将其添加为官方"答案".

**



1> Adron..:

我找到了答案

好吧,不确定是否能回答我自己的问题,但我们走了.由于某种原因,枚举需要用[EnumMember]属性标记如下:

[DataContract]
public enum Priority
{
    [EnumMember]
    Low,
    [EnumMember]
    Medium,
    [EnumMember]
    High
}

一旦我这样做,我的测试和服务可以被调用而不会发生错误.我仍然不确定为什么会显示该特定错误.错误似乎与错误发生的功能原因没有任何关联,但是这个修复肯定能够解决所有问题.


在有人可以抛出的所有随机例外情况中,这是WCF团队能够提出的最佳选择吗?遇到完全相同的问题,我花了很多时间试图弄明白,并且让它更令人气愤,它在我的测试机器上运行但在移动到服务器时无法正常工作.IIS是邪恶的.

2> Sam..:

正如您自己所指出的,如果您将枚举标记为DataContract,您也必须标记这些项目.

作为替代方案,您可以在枚举前删除[DataContract],如下所示:

public enum Priority
{    
  Low,    
  Medium,    
  High
}

这也可以,因为在这种情况下,WCF自己处理枚举.如果您将其标记为[DataContract],则必须按照您自己注意的方式标记每个项目.



3> squig..:

我在返回大型有效负载时遇到此错误,结果是DataContractSerialiser停止了中间流,因为它已达到默认的maxItemsInObjectGraph设置,将以下内容添加到我的端点行为修复了问题


推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有