gpt4 book ai didi

.net - WCF 错误处理和访问类对象

转载 作者:行者123 更新时间:2023-12-02 07:42:42 27 4
gpt4 key购买 nike

我已经使用 IErrorHandler 实现了一些基本的 WCF 错误处理,我可以在其中获取堆栈跟踪并记录它,但是我还想从导致异常的类中记录一些其他信息。

例如,假设我的服务中有以下类(class):

Class Foo
Public User As String
Public PhoneNumber As String

Public Function Bar() As Boolean
Dim c As Collection 'intentionally not set to an object to cause an error below
c.Add(PhoneNumber)
Return True
End Function
End Class

我发现了以下错误:

  Public Function HandleError(ByVal [error] As System.Exception) As Boolean Implements ystem.ServiceModel.Dispatcher.IErrorHandler.HandleError
'Log ex.tostring to event log
'How can I access User and PhoneNumber?
Return False
End Function

我现在有错误的堆栈跟踪。但是我怎样才能访问用户和电话号码?虽然堆栈跟踪很有帮助,但对导致错误的基础数据的引用在错误报告系统中至关重要。

最佳答案

我做了类似的事情,但我没有在 IErrorHandler 扩展点中记录方法调用参数。相反,我最终实现了一个自定义 IOperationInvoker 并在那里处理参数日志记录。这是一个可能有用的代码片段:

public class MyOperationBehavior : IOperationBehavior
{
public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
{
// intentionally empty.
}

public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
{
// intentionally empty.
}

public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
{
// create a name for this operation for logging purposes.
string operationName;
if (operationDescription.SyncMethod != null)
operationName = operationDescription.SyncMethod.DeclaringType.FullName + "." + operationDescription.Name;
else if (operationDescription.BeginMethod != null)
operationName = operationDescription.BeginMethod.DeclaringType.FullName + "." + operationDescription.Name;
else operationName = operationDescription.Name;

dispatchOperation.Invoker = new MyOperationInvoker(operationName, dispatchOperation.Invoker);
}

public void Validate(OperationDescription operationDescription)
{
// intentionally empty.
}
}

.

public class MyOperationInvoker : IOperationInvoker
{
private readonly IOperationInvoker defaultInvoker;
private readonly string operationName;

public MyOperationInvoker(string operationName, IOperationInvoker defaultInvoker)
{
if(defaultInvoker == null)
throw new ArgumentException("DefaultInvoker can not be null.");

this.defaultInvoker = defaultInvoker;
this.operationName = operationName;
}

public object[] AllocateInputs()
{
return defaultInvoker.AllocateInputs();
}

public object Invoke(object instance, object[] inputs, out object[] outputs)
{
Exception error = null;

DoMySuperAwesomePreProcessing(operationName, inputs);

try
{
return defaultInvoker.Invoke(instance, inputs, out outputs);
}
catch (Exception ex)
{
error = ex;
throw;
}
finally
{
DoMySuperAwesomePostProcessing(operationName, inputs, error);
}
}

public bool IsSynchronous
{
get { return defaultInvoker.IsSynchronous; }
}

所以基本上它通过 defaultInvoker 调用它通常会调用的任何东西,但是在调用之前和之后,它有机会与实例、输入、输出和异常进行交互(如果抛出一个)。

在那个后处理点,如果我发现一个错误,我最终会记录它,方法名称,所有输入参数和异常方法都记录下来,所以我们可以尝试重现问题输入相同。

确实 还有一个自定义 IErrorHandler 实现来记录未处理的异常,我只是不从那里记录参数,而是从上面记录参数代码。

希望这会有所帮助!

关于.net - WCF 错误处理和访问类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9332031/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com