2012-02-16 2 views
1

Я создал службу 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?

+0

Почему вы хотите получить эти «переменные»? В любом случае они действительно не существуют. Вместо этого посмотрите, что вы можете получить от различных объектов контекста. –

+0

Когда вы говорите «они вообще не существуют», можете ли вы объяснить? Я хотел бы получить такие вещи, как IP-адрес запрашивающего и имя сервера. Возможно ли это из WebOperationContext? Я не вижу пути от IErrorHander. – Bullines

+1

«серверные переменные» - это вымысел, созданный веб-серверами, для облегчения доступа к этой информации для языков сценариев. На самом деле на самом деле нет набора переменных. Краткие исследования показывают, что вы можете получить доступ к 'OperationContext' из' ProvideFault'. –

ответ

0

У вас есть класс обслуживания, отмеченный следующим атрибутом?

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

+0

Да. Я отредактировал свой вопрос. – Bullines

Смежные вопросы