当枚举无法序列化时,提前失败或明确抛出

2023-12-27

在 WCF 服务返回具有无效值(枚举类型中不存在 int)的枚举成员的 DataContract 的情况下,客户端抛出的异常为The underlying connection was closed: The connection was closed unexpectedly.
奇怪的是,这个异常被触发是因为 DataContractSerializer 无法在连接的服务器端进行序列化。

我宁愿在服务器端运行时,更早地向我扔一些更有用、更重要的东西,但可能会出现编译器警告......

WCF服务合同

    [ServiceContract]
    public interface IDtoService
    {
        [OperationContract]
        MyDto GetData(int value);
    }

    public enum Rating
    {
        None = 0,
        NotSet = 1,
        Somevalue = 34
    }

    [DataContract]
    public class MyDto
    {
        Rating _rate;

        [DataMember]
        public Rating Rating 
        { 
            get { return _rate; } 
            set 
            {
                _rate = value; 
            } 
        }

    }

服务实施

    public class DtoService : IDtoService
    {
        public MyDto GetData(int value)
        {
            var dto = new MyDto {  Rating = (Rating) 42 }; // not in ENUM!
            return dto;
        }
    }

Client

var cl = new DtoServiceClient.DtoServiceClient();
var tada = cl.GetData(1);  // connection closed exception

为了抛出实际的异常,我必须在 VS2010 的调试选项中禁用“仅启用我的代码”,并在“异常”对话框中启用“公共语言运行时异常”的抛出

通过该设置,有价值的例外是:

序列化异常
枚举值“42”对于类型无效 'WcfService1.Rating' 并且无法序列化。确保 存在必要的枚举值并标记为 如果类型具有 DataContractAttribute,则为 EnumMemberAttribute 属性 属性

这是以调试器对所有其他类型的抛出异常(据我所知可以忽略)变得非常嘈杂为代价的。

我可以尝试如何在没有噪音的情况下抛出此异常?

我可以在 WCF 管道中调整或添加一些内容吗?

一种可能的解决方案是在枚举成员的 setter 中添加一个额外的 Assert ,从而导致早期失败并导致返工成本:

Debug.Assert(Enum.IsDefined(typeof(Rating), value),"value is not valid for this enum");

我尝试的另一种选择是添加合同,希望能够产生警告。我找不到比 Debug.Assert 的副本更好的东西了。

System.Diagnostics.Contracts.Contract.Assert(Enum.IsDefined(typeof(Rating), value));

是否可以选择让编译器为我发出此检查,或者是否有我不知道的替代方案?
(我也尝试用check for arithmetic overflow/underflow启用但不期望它成功)

代码合约确实发出警告(您必须启用隐式枚举写入义务),但这并没有真正帮助

实际值可能不在为此枚举值定义的范围内

此行为发生在 VS2010/.Net 4.0 上下文中。


你可以做一些事情。

在 WCF 端,使用IncludeExceptionDetailInFaults(或者使用服务行为 http://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.includeexceptiondetailinfaults.aspx属性或在你的应用程序配置 http://msdn.microsoft.com/en-us/library/ms788993.aspx)。这将使 WCF 向客户端发送详细的异常。请注意,这被认为是“不安全”设置,因为它向客户端公开服务器堆栈跟踪,因此您应该仅在开发期间使用它。对于生产,您应该使用 WCF 错误处理程序来记录所有服务错误(或打开 WCF 跟踪)。

如果您想使用代码契约来捕获此错误编译时间您可以使用对象不变量:

public class MyDto
{
    public Rating Rating { get; set; }

    [ContractInvariantMethod]
    void Invariant()
    {
        Contract.Invariant(Enum.IsDefined(typeof(Rating), Rating));
    }
}

如果启用静态分析,您将在这一行收到警告:

new MyDto {  Rating = (Rating) 42 };
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当枚举无法序列化时,提前失败或明确抛出 的相关文章

  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • 为什么'enable_if'不能用于禁用这里声明

    include
  • 一元 +/- 运算符如何可能导致“-a”或“+a”中的整数提升,“a”是算术数据类型常量/变量?

    这句看似微不足道的台词摘自我的迈克 巴纳汉和布雷迪的 C 书 第 2 8 8 2 节 http publications gbdirect co uk c book chapter2 expressions and arithmetic h
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • 使用具有抗锯齿功能的 C# 更改抗锯齿图像的背景颜色

    我有一个图像需要更改背景颜色 例如 将下面示例图像的背景更改为蓝色 然而 图像是抗锯齿的 所以我不能简单地用不同的颜色替换背景颜色 我尝试过的一种方法是创建第二个图像 仅作为背景 并更改其颜色并将两个图像合并为一个图像 但是这不起作用 因为
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • 在 C#.NET 中安全删除文件

    在我正在做的一个项目中 我想为用户提供 安全 删除文件的选项 例如 用随机位或 0 覆盖它 在 C NET 中是否有一种简单的方法可以做到这一点 效果如何 你可以调用系统内部删除 http technet microsoft com en
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • 来自 3rd 方库的链接器错误 LNK2019

    我正在将旧的 vc 6 0 应用程序移植到 vs2005 我收到以下链接器错误 我花了几天时间试图找到解决方案 错误LNK2019 无法解析的外部符号 imp 创建AwnService 52 在函数 public int thiscall
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl

随机推荐

  • Mac 上的 RTLD_FIRST 是否能完成 Linux 上 RTLD_DEEPBIND 的工作?

    我对 Linux 上 RTLD DEEP BIND 的理解是 如果主程序中有一个函数 A 并且动态链接库 称为 lib 中有两个函数 A 和 B 其中 B 定义为 B A 那么对 B 的调用最终总是会从库中调用 A 这是 RTLD FIRS
  • Pandas `agg` 列出,“AttributeError / ValueError:函数不减少”

    很多时候我们表演的时候groupby使用 pandas 进行操作时 我们可能希望在多个系列中应用多个函数 groupby agg https pandas pydata org pandas docs stable generated pa
  • 如何禁用点击但仍允许在 iframe 中滚动?

    我的页面上显示了一个固定高度的面板中的 iframe 但 iframe 中呈现的页面要大得多 我不希望用户能够单击 iframe 中的任何内容 我知道对此的一般解决方案是在 iframe 顶部放置一个不可见的 div 来禁用所有交互 但是
  • 如何获取 Objective-C 字典中每个键的值?

    我正在维护一个NSMutableDictionary它保存键和值对 现在我需要对其中的每个值执行一些操作 如何从字典中检索值 this is NSMutableDIctionary NSMutableDictionary dictobj N
  • 如何在 Perl 中引用列表?

    我读到scalars arrays and list 我不确定是什么意思list 例如 5 apple x 3 14 is a list 但是实际引用列表的变量是什么 列表只是初始化数组的一种方式还是已知的数据结构 如何在 Perl 中引用
  • 如何从构建到发布管道获取TFS/AzureDevOps中的变量值?

    我在 TFS AzureDevops Build 定义中定义了一个变量 假设它是time 并在我的构建定义中使用 PowerShell 任务分配值 Like Type 内联脚本 内联脚本 date Get Date Format g Wri
  • 在Delphi中连接Mysql数据库的最佳方式是什么

    在 Delphi 中连接到 Mysql 5 1 x 时最好使用什么组件 为什么 没有其他数据库组件可以击败 DevArt DB 组件 他们有MyDac http www devart com mydac and UniDac http ww
  • 如果编译器兼容 Cpp0x,#define 是什么?

    当编译器符合 Cpp0x 时 是否有任何官方或非官方的 defines 更好的是 对于特定的 Cpp0x 功能 cpp0xlambda cpp0xrvalue 等 网上没找到这方面的资料 对于根据 16 8 1 的 C 03 预定义宏名称
  • Facebook iframe 无法在 IE 中运行;会话/登录问题?

    我的 Facebook canvas iframe 应用程序有问题 我正在使用会话来构建一个简单的问卷式应用程序 每页上都有一个问题 提交表单时答案将存储在会话数组中 并且页码会加一 然后显示下一个问题 简单的东西 然而 这个应用程序 适用
  • 为 GWT Comet 使用大气

    我正在寻找一个简单的框架来为我的 GWT 应用程序实现 Comet 我查看了似乎不活跃的 gwt rocket 然后查看了不活跃的 gwt comet 然后查看了已移入大气项目的atmosphere gwt comet 最后 尝试从大气中实
  • nextjs 用于身份验证的路由中间件

    我正在尝试找出一种适当的身份验证方法 我知道这是一个敏感的话题GitHub 问题页面 https github com zeit next js issues 153 我的身份验证很简单 我在会话中存储 JWT 令牌 我将其发送到不同的服务
  • 如何将参数从外部汇编器子例程传递回 cobol 程序?

    我试图从用汇编程序编写的外部子例程传回参数 调用例程是在 cobol 中 外部汇编例程的参数如下所示 01 CALCSHRS PARMS 05 CS DEPOSIT AMT PIC 9 5 V99 COMP 3 05 CS SHARE PR
  • 将多个数据合并为一个数据

    我有这样的数据 CCSKIYEARDOULE CCSKIYEAR 92 93 92 92 93 93 94 95 94 94 95 95 96 97 97 但我想要这样的输出 CCSKIYEARDOULE CCSKIYEAR 92 93 9
  • 使用远程验证进行多字段验证

    我有以下模型 public class Customer public string FirstName get set public string LastName get set Remote CardExisting Validati
  • 如何使用 O(n) 时间和 O(1) 空间成本就地合并两个排序整数数组

    例如 给定一个整数数组及其两个连续序列的开始位置 即 b1 和 b2 此外还提供了位置 last 该位置指示第二个序列的结束位置 从数组 b1 到数组 b2 1 和从数组 b2 到数组 last 都是分开的顺序 如何将它们合并到位使用 O
  • 使用python将某个网站的HTML保存在txt文件中

    我需要将任何网站的 HTML 代码保存在 txt 文件中 这是一个非常简单的练习 但我对此表示怀疑 因为有一个函数可以执行此操作 import urllib request def get html url f open htmlcode
  • MySQL 连接器和许可 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想到 MySQL 连接器 Java 和 NET 是 GPL 许可的 这是否意味着供应商 不是为内部应用程序开发 必须购买通过这些连接器与
  • 如果我设置 min-height 和 max-height,哪一个优先?

    我有一个菜单 有 9 个项目 我希望按钮高度为屏幕尺寸的 40px 或 11 屏幕的 1 9 不管是最大的 现在我有 min height 40px max height 11 并且始终为 40px 即使我的屏幕尺寸比这个大 我可以在 cs
  • min-sdk 大于以前版本的 android

    我有一个应用程序 它已经在 Play 商店中存在多年了 我刚刚进行了更新 该更新利用了 numberpicker 它的 min sdk 为 11 并且 v4 支持库不满足该需求 我倾向于发布我的新版本并在清单中将 min sdk 设置为 1
  • 当枚举无法序列化时,提前失败或明确抛出

    在 WCF 服务返回具有无效值 枚举类型中不存在 int 的枚举成员的 DataContract 的情况下 客户端抛出的异常为The underlying connection was closed The connection was c