Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.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
.net 访问服务器变量时发生异常_.net_Wcf - Fatal编程技术网

.net 访问服务器变量时发生异常

.net 访问服务器变量时发生异常,.net,wcf,.net,Wcf,我已经创建了一个RESTful WCF 4.0服务。为了捕获并记录未处理的异常,我创建了一个错误处理程序,我想在其中收集服务器变量以用于记录。但是,访问HttpContext.Current.Request.ServerVariables会引发“值不在预期范围内”异常: public class MyErrorHandler : IErrorHandler, IServiceBehavior { public void AddBindingParameters(ServiceDescri

我已经创建了一个RESTful WCF 4.0服务。为了捕获并记录未处理的异常,我创建了一个错误处理程序,我想在其中收集服务器变量以用于记录。但是,访问HttpContext.Current.Request.ServerVariables会引发“值不在预期范围内”异常:

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)]