当客户端将无效的SOAP请求传递给WCF服务协定时(抛出NetDispatcherFaultException),我需要记录有关合同调用的信息(以下信息:请求,客户端地址,调用的方法名称)。 我可以从Global类(Global.asax)中的HttpContext对象获取所有需要的信息,例如在Application_EndRequest事件处理程序中。我的代码(工作正常):
protected void Application_EndRequest(object sender, EventArgs e)
{
const string InfoMessageTemplate = "Client [address='{0}'] called following contract: '{1}'. Request data: {2}";
var currentRequest = Context.Request;
var calledContract = currentRequest.Headers["SOAPAction"] ?? string.Empty;
string clientAddress = currentRequest.UserHostAddress;
var requestInputStream = new StreamReader(currentRequest.InputStream);
string requestString = HttpUtility.UrlDecode(requestInputStream.ReadToEnd());
Logger.Info(InfoMessageTemplate, clientAddress, calledContract, requestString);
}
但是我不想记录所有请求,只有在抛出NetDispatcherFaultException时。我建议HttpContext.Error和/或HttpContext.AllErrors属性应包含有关已发生异常的信息,但它们始终为空(等于NULL)。
我已经实现了IErrorHandler(全局异常处理)并将其连接到我的WCF服务。每次发生任何错误时都会调用HandleError方法。但我无法访问此方法中的HttpContext(因为此方法在另一个线程中执行),我无法获取所有需要的日志信息。
所以,我认为我最后的希望是Global.asax中的事件处理程序。如果我能够获得有关发生错误的信息,它将对我有很大帮助。我能以某种方式这样做吗?