.net 访问服务器变量时发生异常
我已经创建了一个RESTful WCF 4.0服务。为了捕获并记录未处理的异常,我创建了一个错误处理程序,我想在其中收集服务器变量以用于记录。但是,访问HttpContext.Current.Request.ServerVariables会引发“值不在预期范围内”异常:.net 访问服务器变量时发生异常,.net,wcf,.net,Wcf,我已经创建了一个RESTful WCF 4.0服务。为了捕获并记录未处理的异常,我创建了一个错误处理程序,我想在其中收集服务器变量以用于记录。但是,访问HttpContext.Current.Request.ServerVariables会引发“值不在预期范围内”异常: public class MyErrorHandler : IErrorHandler, IServiceBehavior { public void AddBindingParameters(ServiceDescri
public class MyErrorHandler : IErrorHandler, IServiceBehavior
{
public void AddBindingParameters(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
{
IErrorHandler errorHandler = new VirusInfoErrorHandler();
foreach (ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers)
{
ChannelDispatcher channelDispatcher = channelDispatcherBase as ChannelDispatcher;
if (channelDispatcher != null)
{
channelDispatcher.ErrorHandlers.Add(errorHandler);
}
}
}
public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
{
}
public bool HandleError(Exception error)
{
// I'd like to log here but accessing
// HttpContext.Current.Request.ServerVariables
// throws a "Value does not fall within the expected range" exception.
return true;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
}
}
没有办法从WCF的上下文中检索服务器变量吗?您的服务类是否标记了以下属性
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
为什么要检索这些“变量”?它们在任何情况下都不存在。相反,看看你能从各种上下文对象中得到什么。当你说“它们在任何情况下都不存在”时,你能解释一下吗?我关心的是检索请求者的IP地址和服务器的名称。从WebOperationContext可以这样做吗?我看不到来自IErrorHander的方法。“服务器变量”是web服务器发明的一种虚构,它使脚本语言更容易访问这些信息。在某个地方实际上没有一组变量。简要研究表明,您可以从
providdefault
中访问OperationContext
。
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class MyService
{
[WebGet(UriTemplate="/my-method", ResponseFormat=WebMessageFormat.Json)]
public Message MyMethod()
{
// might return good things
// might throw an exception in downstream tiers
}
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]