2012-02-16 8 views
1

RESTful WCF 4.0 서비스를 만들었습니다. 캡처되지 않은 처리되지 않은 예외를 캡처하고 기록하기 위해 로깅 목적으로 서버 변수를 수집하려는 오류 처리기를 만들었습니다.서버 변수에 액세스 할 때 예외가 발생했습니다.

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> 

서비스 클래스와 방법은 그러나 HttpContext.Current.Request.ServerVariables에 접근하는 것은 예외 "값이 예상 범위를 벗어 않는다"던졌습니다 :

[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

"서버 변수"는 스크립팅 언어가이 정보에 쉽게 액세스 할 수 있도록 웹 서버에서 고안된 소설입니다. 실제로 어딘가에 변수 집합이 없습니다. 간단한 연구는'ProvideFault'에서'OperationContext'에 접근 할 수 있다고 제안합니다. –

답변

0

서비스 클래스에 다음 속성이 표시되어 있습니까?

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

+0

예. 내 질문을 편집했습니다. – Bullines

관련 문제