WCF IErrorHandler 扩展未返回指定的故障

2023-12-07

希望有一些 WCF 向导能够发现我的错误。

我正在尝试通过 RESTful JSON WCF 服务上基于 IErrorHandler 的行为扩展来设置全局错误处理程序。该方法被修饰如下:

[OperationContract]
[WebGet(UriTemplate = "screens/info", ResponseFormat = WebMessageFormat.Json)]

IErrorHandler 的实现是:

public class ErrorHandler : IErrorHandler
{
    public void ProvideFault(Exception error, 
                             MessageVersion version, 
                             ref Message fault)
    {
        var error = new JsonError 
                        { 
                            Message = error.Message, 
                            FaultCode = -1, 
                            StackTrace = error.StackTrace
                        };

        fault = Message.CreateMessage(version, 
                    "", 
                    ideaScreeningError, 
                    new DataContractJsonSerializer(
                        ideaScreeningError.GetType()));

        // tell WCF to use JSON encoding rather than default XML
        var wbf = new WebBodyFormatMessageProperty(WebContentFormat.Json);
        fault.Properties.Add(WebBodyFormatMessageProperty.Name, wbf);

        //Modify response
        var rmp = new HttpResponseMessageProperty 
                      { 
                          StatusCode = HttpStatusCode.BadRequest, 
                          StatusDescription = "Bad Request"
                      };

        fault.Properties.Add(HttpResponseMessageProperty.Name, rmp);
    }

    public bool HandleError(Exception error)
    {
        return true;
    }
}

我可以(通过断点)验证扩展是否正在被调用并且正在正确执行。当我在浏览器中查看 AJAX 调用的结果时,我可以看到 WCF 仍然返回 500 内部服务器错误,而不是我在错误处理程序中指定的故障详细信息。

如果我更改 WCF 方法中引发的异常类型,这些异常类型会反映在浏览器的结果中,因此我可以推测 WCF 正在执行某些操作来处理异常并在内部返回某些内容。

我该如何让它停止!?

EDIT

我正在添加自定义行为元素:

public class ErrorBehaviorElement : BehaviorExtensionElement
{
    protected override object CreateBehavior()
    {
        return new ErrorBehavior();
    }

    public override Type BehaviorType
    {
        get { return typeof(ErrorBehavior); }
    }
}

和行为:

internal class ErrorBehavior : WebHttpBehavior
{
    protected override void AddServerErrorHandlers(ServiceEndpoint endpoint,
        EndpointDispatcher endpointDispatcher)
    {
        // clear default error handlers.  
        endpointDispatcher.ChannelDispatcher.ErrorHandlers.Clear();

        // add the Json error handler.  
        endpointDispatcher.ChannelDispatcher.ErrorHandlers.Add(
            new ErrorHandler());
    }  
}

这里的问题在于 WCF Rest Starter Kit(我没有意识到它正在使用,因为我没有启动这个项目),更具体地说WebServiceHost2。我在 Reflector 中打开 ServiceHost,发现了这段可爱的小代码OnOpening():

if (endpoint.Behaviors.Find<WebHttpBehavior>() != null)
{
    endpoint.Behaviors.Remove<WebHttpBehavior>();
    WebHttpBehavior2 item = new WebHttpBehavior2();
    // other code omitted
    endpoint.Behaviors.Add(item);
}

正如您所看到的,无论您想要向端点添加什么行为,只要它继承自 WebHttpBehavior,Rest Start Kit 组件就会劫持您的处理程序,将其删除,然后用自己的处理程序替换。

请记住,WebHttpBehavior2 也继承自 WebHttBehavior,因此在我的扩展中继承 WebHttpBehavior2 对解决问题没有任何帮助。

第一步是创建一个新的 WebServiveHost,它派生自WebServiceHost2并推翻OnOpening()并重新劫持 Rest Starter Kit 从我那里偷来的东西:

if(endpoint.Behaviors.Find<WebHttpBehavior>() != null)
{
    endpoint.Behaviors.Remove<WebHttpBehavior>();
    var item = ErrorBehavior();
    // other code
    endpoint.Behaviors.Add(item);
}

然后创建一个新的 WebServiceHostFactory 返回我的自定义 WebServiceHost 类型。

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

WCF IErrorHandler 扩展未返回指定的故障 的相关文章

  • 是否可以使用 http url 作为 DirectShow .Net 中源过滤器的源位置?

    我正在使用 DirectShow Net 库创建一个过滤器图 该过滤器图通过使用 http 地址和 WM Asf Writer 来流式传输视频 然后 在网页上 我可以使用对象元素在 Windows Media Player 对象中呈现视频源
  • 为什么 C 程序使用 Scanf 给出奇怪的输出?

    我目前正在学习 C 编程 并且遇到了这个奇怪的输出 Program will try functionalities of the scanf function include
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • 使用 JSON 的 Pentaho HTTP Post

    我是 Pentaho 的新手 我正在尝试执行以下工作流程 从数据库中读取一堆行 做一些转换 将它们以 JSON 格式发布到 REST Web 服务 我已经使用输入步骤和 Json 输出步骤解决了前两个问题 但是 我在执行最后一步时遇到两个问
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • GSON 将带有日历的对象反序列化为带有 Mongo 日期的 json 并返回

    我有一些实体 其中包含一些日历属性 我想以将它们存储为 GSON 序列化 JSON 中的日期的方式对其进行序列化 因为 Mongo 可以将 date 存储为 new ISODate 我们通常通过使用 ExclusionStrategy 忽略
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 自定义 XYJfree 图表中的条形颜色

    如何用不同的颜色绘制不同的条形 我尝试使用渲染器 这是我的示例代码 public IntervalXYDataset createDataset throws InterruptedException parseFile final XYS
  • .NET Standard 2.0 使用的兼容性填充程序

    概述 example NET Standard 2 0 表示它现在使用某种兼容性填充程序来修复第三方库兼容性问题 因此 您可以将第三方库与 NET Standard 一起使用 直到它不使用 NET Standard 没有的任何 API 不清
  • 如果 iCloud 设置为不同步提醒,则无法创建本地 EKCalendar(提醒)

    这里遇到了一个非常奇怪的问题 在我看来这是 EventKit API 的问题 我只是想检查一下我没有做什么 测试用例1 在应用程序的隐私中启用提醒 该设备有 iCloud 帐户 但设置为不同步提醒 我可以创建一个localApple 的 提
  • 从列表集合中删除重复项

    希望可以有人帮帮我 我正在使用 c 并且对它有点陌生 我正在将一个文本文件加载到我的应用程序中 并将数据拆分为 我正在将字符串的一部分读入
  • Android 设备上短信的默认字符集/编码是什么?

    如果有必要保持简单的话 我主要关心北美的英语手机 具体来说 当发送 接收短信和彩信时 字符是如何编码的 有区别吗 我的初步研究表明UTF 8是默认值 但我也看到了对US ASCII对于美国设备和其他区域设置的其他字符集 Quote 平台默认
  • 如何重新启动 TimerTask

    我编写了一个任务来通过套接字发送特定的 TCP 消息 我有一个包含一堆消息和一些时间戳的文件 因此我将该任务编程为 TimerTask 并使用具有第一个消息时间戳的计时器对其进行调度 当它完成时 任务运行方法结束 但其关联的线程仍然存在 并
  • AFNetworking 2.0下载多张图片完成

    我正在尝试找出一种使用 AFNewtorking 2 0 下载多个图像的方法 我在这里读了很多帖子 但找不到我正在寻找的答案 希望你们能帮助我 问题是我想知道所有下载何时完成以及所有图像是否已下载 所以我有一个带有图像 URL 的数组 蚂蚁
  • SQL 合并时出现 ORA-38104 错误的原因是什么?

    我有这样的代码 MERGE INTO target table tgt USING source table src on tgt c1 src c1 WHEN MATCHED THEN UPDATE SET tgt c1 src c2 I
  • 根据跨越边界的数量,用颜色突出显示超过或低于阈值的 matplotlib 点

    我有一个如下所示的图表 我为获取该图 8 个图的序列之一 而运行的代码如下 date list list df testing set date unique random date list list np random choice d
  • JSON4s 找不到带 Spark 的构造函数

    我在尝试在 Spark 作业中解析 json 时遇到了问题 我使用的是 Spark 1 1 0 json4s 和 Cassandra Spark 连接器以及 DSE 4 6 抛出的异常是 org json4s package Mapping
  • 适当的CSS以确保body元素填满整个屏幕

    我的身体元素有问题 似乎 100 占满了屏幕 但是 如果您将浏览器拖动得较小 然后向下滚动 则主体不会扩展 请参见这个jsFiddle作为一个很好的例子 height 100 是您网站显示的窗口的高度 而不是网站的高度 这会导致向下滚动时背
  • TPL数据流处理N条最新消息

    我正在尝试创建某种队列来处理收到的 N 个最新消息 现在我有这个 private static void SetupMessaging messagingBroadcastBlock new BroadcastBlock
  • 页面加载超时 - 使用 C# 的 Selenium Webdriver

    我正在使用 Selenium 2 25 WebDriver 我在查找页面上的元素时遇到问题 有时我的测试用例能够找到元素 有时页面未加载 这是由于页面加载所致 如果我在下面添加此行 它似乎可以工作 driver Manage Timeout
  • 无法加载库 plpython3.dll

    我在 Postgresql 版本 10 中创建扩展时遇到错误 无法加载库 C Program Files PostgreSQL 10 lib plpython3 dll 找不到指定的模块 CREATE EXTENSION plpython3
  • 我如何/我可以通过 JavaScript 访问 sessionid cookie?

    我已经安装了 jquery 的 cookie 扩展 并且正在尝试访问会话 id cookie 我的会话当前有两个 cookie 请参阅下面的屏幕截图 然而 cookie 只列出了一个 gt cookie Object csrftoken f
  • Rcpp:处理 NumericMatrix 时,* 的语法糖会产生意想不到的结果

    最近被问到的一个问题让我相信语法糖 by Rcpp不按预期工作 在链接的问题中 用户试图将矩阵乘以标量 R code 这就是我们想要实现的目标Rcpp 但现在简单地说R gt m lt matrix 0 3 2 2 gt m 3 1 2 1
  • 旋转轴刻度标签

    我不知道如何在 X 轴上旋转文本 它是一个时间戳 因此随着样本数量的增加 它们会越来越近 直到重叠 我想将文本旋转 90 度 这样当样本靠得更近时 它们就不会重叠 下面是我所拥有的 它工作正常 但我不知道如何旋转 X 轴文本 import
  • 计算每年两个日期之间的天数

    我有一个数据框 每行都有开始日期和结束日期 我想计算两个日期之间的天数并按年份分割 所以从这里开始 id lt c 1 2 3 start lt as Date c 01 01 2015 01 01 2016 07 01 2015 form
  • JWT 的安全性如何

    我知道这个问题不是什么新鲜事 可能已经在互联网上讨论过 我是新手 但经过一些研究 我同意它是安全的 因为匿名可以嗅探令牌但无法在其上附加任何内容 我计划将 JWT 存储在 HTML5Storage 中 并解码有效负载以获取一些不敏感信息 D
  • WCF IErrorHandler 扩展未返回指定的故障

    希望有一些 WCF 向导能够发现我的错误 我正在尝试通过 RESTful JSON WCF 服务上基于 IErrorHandler 的行为扩展来设置全局错误处理程序 该方法被修饰如下 OperationContract WebGet Uri