Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF从System.SecurityException剥离详细信息_C#_Wcf_Exception Handling - Fatal编程技术网

C# WCF从System.SecurityException剥离详细信息

C# WCF从System.SecurityException剥离详细信息,c#,wcf,exception-handling,C#,Wcf,Exception Handling,我正在为WCF服务实现IErrorHandler,目的是自动记录消息 在测试期间,我决定抛出一个带有内部异常和一些用户定义数据的System.SecurityException: try { LevelTwo(); } catch (Exception innerEx) { var outerEx = new SecurityException("Is security special?", innerEx); outerEx.Data.Add("foo", "bar")

我正在为WCF服务实现IErrorHandler,目的是自动记录消息

在测试期间,我决定抛出一个带有内部异常和一些用户定义数据的
System.SecurityException

try
{
    LevelTwo();
}
catch (Exception innerEx)
{
    var outerEx = new SecurityException("Is security special?", innerEx);
    outerEx.Data.Add("foo", "bar");
    throw outerEx;
} 
然而,当它在我的错误处理程序中点击我的
ProvideFault
方法时,它已经被转换为带有“访问被拒绝”消息的
System.ServiceModel.FaultException
。原始消息、异常类型、数据和内部异常都已丢失,我无法记录它们。其他异常类型按预期工作,为日志记录公开所有这些属性

我假设有一个
IErrorHandler
的框架实现,它首先被命中,然后对其进行转换,剥离细节并提供一个通用消息,这通常都是很好的,但当我想记录细节时就不行了

有人在MSDN上提出了同样的问题,但没有得到任何特别好的答案

理想情况下,我希望更改错误处理程序的顺序,以便首先命中我的错误处理程序-这可能吗?

如果没有-是否可以删除现有的处理程序,如果可以,是否有任何不良后果

编辑 按照Christian下面的建议,异常似乎被
SyncMethodInvoker.Invoke()中的代码捕获


我认为这意味着安全异常是一种非常特殊的情况,可能没有好的解决方法,但我希望得到任何建议。

我现在不是一台合适的计算机,所以我无法自己测试它,但我认为WCF确实将任何安全异常转换为您观察到的内容

如果您查看“rethrown”SecurityExceptions的完整调用堆栈,您应该会看到堆栈帧在其起始位置暗示。有了这些信息,您可以查看相关代码

话虽如此,WCF中有多个
IOperationInvoker
实现,它们处理不同的服务操作调用样式(异步、同步等)

有关示例,请参见:

因此,我认为IErrorHandlers的顺序对这个问题没有任何帮助,因为在调用错误处理程序之前,异常会被转换/剥离/替换


我会考虑为安全问题创建自己的故障类型,比如Suffice故障类型,然后将其作为<代码>故障排除(…)< /代码>。该故障类型可以具有所需的所有属性。此外,由于故障类型是DataContract,并且属性是DataMembers,因此不会出现序列化问题,因为您可能会无意中将不可序列化的数据放入异常的

数据中

——这是一些有用的信息。我尝试在服务器端进行日志记录,因此我并不担心序列化或客户端看到的异常,当然我可以选择不在自己的代码中抛出安全异常,但我更希望能够捕获并记录所有异常,但序列化仍然是一个问题:当您记录了异常时,它将被传递并序列化-除非您也在
IErrorHandler.ProvideFault
方法中用安全的方法替换它(在那里,完成了)。坦白地说,我以前从未见过SecurityException行为(但也从未明确地研究过)。请注意,有些异常无论如何都无法记录(如上述序列化错误),因为它们可能发生在错误处理程序运行之后。这里唯一的机会是使用WCF跟踪,以防出现“延迟”(或“提前”传入请求)错误
catch (System.Security.SecurityException e)
{
    DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning);
    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError
        (AuthorizationBehavior.CreateAccessDeniedFaultException());
}