访问服务器变量时出现异常

时间:2012-02-16 23:49:43

标签: .net wcf

我已经创建了一个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)
    {
    }
}

我的配置如下:

    <system.serviceModel>
  <behaviors>
    <endpointBehaviors>
      <behavior name="Rest">
        <webHttp />
      </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
      <behavior>
        <serviceDebug includeExceptionDetailInFaults="False" httpHelpPageEnabled="False" />
        <serviceAuthorization serviceAuthorizationManagerType="ACME.MyAuthorizationManager, ACME.Authorization" />
        <errorHandler /> 
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <extensions>
    <behaviorExtensions>
      <add name ="errorHandler" type="ACME.MyErrorHandlerElement, ACME.MyErrorHandler"/>
    </behaviorExtensions>
  </extensions>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  <standardEndpoints>
    <webHttpEndpoint>
      <standardEndpoint name="" faultExceptionEnabled="true" helpEnabled="true" automaticFormatSelectionEnabled="true"  />
    </webHttpEndpoint>
  </standardEndpoints>
  <bindings>
    <basicHttpBinding>
      <binding name="BasicHttpBinding_IAppAccess" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
          allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
          maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
          messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
          useDefaultWebProxy="true">
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        <security mode="None">
          <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
          <message clientCredentialType="UserName" algorithmSuite="Default" />
        </security>
      </binding>
    </basicHttpBinding>
  </bindings>
</system.serviceModel>

服务类和方法是:

    [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
    }
}

是否有办法从WCF的上下文中检索服务器变量?

1 个答案:

答案 0 :(得分:0)

您的服务类是否标有以下属性?

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]