태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.
   情  
Front Page
Tag | Location | Media | Guestbook | Admin   
 
'exception'에 해당하는 글(3)
2009.11.22   [WCF] Global Level에서 Exception 처리 또는 기록
2009.10.11   [WCF] URI ~에 대한 요청을 만드는 동안 오류가 발생했습니다.
2009.10.10   [WCF] '원격 서버에서 오류를 반환했습니다. NotFound' 오류


[WCF] Global Level에서 Exception 처리 또는 기록

서문

Applcation에서 발생한 Exception을 분석하고 처리하기 위해 Exception을 파일로 기록하려는 경우, 모든 Try, Catch에 Exception을 기록하는 로직을 두는 것은 여간 괴로운 일이 아닙니다. 이러한 코드 작성 방식은 시스템 유지보수에 있어서 더 치명적입니다. 여기에서는 WCF에서 발생하는 Exception을 OS의 EventLog에 기록하는 클래스를 작성하고 WCF Service에 부여하는 방법에 대해서 소개할 것입니다.

Exception을 기록하는 것 뿐만 아니라, Application 전역에서 발생하는 모든 Exception에 대해서 특정한 동작을 부여하고 싶을 분들에게 이 포스트가 도움이 될 수 있습니다.

구현

이 기능의 구현은 WCF를 확장하는 몇 가지 Interface를 구현하고 Web.Config에 설정을 추가하는 것만으로 실현될 수 있습니다.

  1. IErrorHandler Interface를 구현하여 에러 처리기를 작성합니다.
    using System;
    using System.ServiceModel.Dispatcher;
    using System.ServiceModel.Channels;
    using System.Diagnostics;
    
    /// <summary>
    /// 이벤트 처리기
    /// </summary>
    public class ErrorHandler : IErrorHandler
    {
        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            //이 Method는 Exception을 Fault로 바꾸고자 할 때 사용합니다.
        }
        public bool HandleError(Exception error)
        {
            //1. EventSource 생성
            if (!EventLog.SourceExists("NakedStrength")) 
                EventLog.CreateEventSource("NakedStrength", "Application");
    
            //2. Exception 쓰기
            EventLog.WriteEntry("NakedStrength", error.ToString());
            return false;
        }
    }
    HandleError Method는 Exception이 발생할 때마다 실행될 것입니다. 마지막에 return false;를 통해 Exception이 Handle되지 않도록 하였습니다.
  2. 동작중인 각 Service에 위에서 작성한 ErrorHandler를 추가하는 Service Behavior의 작성이 필요합니다. 이 것은 IServiceBehavior Interface를 상속함으로서 구현가능합니다.
    using System;
    using System.ServiceModel.Description;
    using System.ServiceModel;
    using System.Collections.ObjectModel;
    using System.ServiceModel.Channels;
    using System.ServiceModel.Dispatcher;
    
    /// <summary>
    /// ErrorHandler를 모든 Service Channel에 적용하는 ServiceBehavior
    /// </summary>
    public class ErrorServiceBehavior : IServiceBehavior
    {
        public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
    
        }
        public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
        {
    
        }
        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
            ErrorHandler handler = new ErrorHandler();
            foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
                dispatcher.ErrorHandlers.Add(handler);
        }
    }
    ApplyDispatchBehavior Method에서 위에서 작성한 ErrorHandler를 생성하여 동작 중인 ServiceChannel에 추가하고 있습니다.
  3. 이제 위에서 생성한 Service Behavior를 Web.Config에 추가하기 위해 Extension Element을 생성해야 합니다.
    using System;
    using System.ServiceModel.Configuration;
    
    /// <summary>
    /// 생성한 ErrorServiceBehavior를 Web.Config에 추가히기 위해 확장엘리먼트로 생성
    /// </summary>
    public class ErrorHandlerBehavior : BehaviorExtensionElement
    {
        protected override object CreateBehavior()
        {
            return new ErrorServiceBehavior();
        }
        public override Type BehaviorType
        {
            get
            {
                return typeof(ErrorServiceBehavior);
            }
        }
    }
  4. 마지막으로 WCF의 Web.Config의 <system.serviceModel> Element를 다음과 같이 구성합니다.
    <system.serviceModel>
        <extensions>
            <behaviorExtensions>
                <!-- Exception Log 기능 추가 -->
                <add name="ExceptionLogger" type="Dispatch.Service.ErrorHandlerBehavior, Dispatch.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
            </behaviorExtensions>
        </extensions>
    
           .. 기타 노드
    
    </system.serviceModel>

결과

이로서 모든 설정은 마쳤습니다. 이제 Exception을 발생시키면 다음과 같이 Event Log에 기록으로 남을 것입니다. OS의 Event View를 통해 확인하면 다음과 같습니다.

image

 

Event Logging에 대한 더 자세한 정보

http://msdn.microsoft.com/ko-kr/library/k00ce235.aspx

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Tag : exception, log, WCF

name    password    homepage
 hidden


[WCF] URI ~에 대한 요청을 만드는 동안 오류가 발생했습니다.

 

에러 메시지는 ‘URI 'http://localhost:19982/MyWCF.Service/serviceForSilverlight.svc'에 대한 요청을 만드는 동안 오류가 발생했습니다. 적절한 상호 도메인 정책 없이 상호 도메인 경로의 서비스에 액세스하려고 했거나 SOAP 서비스에 적합하지 않은 정책을 사용하려고 했기 때문일 수 있습니다. 서비스 소유자에게 문의하여 상호 도메인 정책 파일을 게시하고 SOAP 관련 HTTP 헤더가 전송될 수 있도록 할 수 있습니다. 이 오류는 InternalsVisibleToAttribute 특성을 사용하지 않고 웹 서비스 프록시에서 내부 형식을 사용해서 발생한 문제일 수도 있습니다. 자세한 내용은 내부 예외를 참조하십시오.’ 입니다.

해결

  1. 보통 눈치가 빠른 분들은 금방 알아 차리셨겠지만, 위에서 예를 든 에러는 주소를 잘못 입력해서 나타나는 경우입니다. 위의 주소만 봐도 ‘localhost:19982’가 눈에 뛰는데요, 보통 VisualStudio Development Server로 WCF를 페이지로 띄어보고 그 주소를 그대로 Silverlight 또는 ASP.NET에서 사용한 경우에 발생합니다. 위의 에러가 나면 먼저 주소가 제대로 되었는지 다시 한번 확인해 보는 것이 필요합니다.
  2. WCF를 사용하면서 접하게 되는 가장 당혹스러운 일은 WebService참조를 추가하고 업데이트를 하다보면은 주소가 자동으로 localhost로 바뀌는 버그가 있다는 점입니다. 예를 들어 WebService 주소를 "http://192.168.0.20:88/Service.svc?wsdl"로 설정하였더라도, 가끔식 주소가 "http://localhost:88/Service.svc?wsdl"로 변경되버립니다. 따라서 에러가 발생하면 주소를 확인하고 주소를 원하는 주소로 다시 되돌리시면 됩니다.
  3. 마지막으로 많이 발생하는 경우가 바로 ‘상호 도메인 정책’파일을 WCF 측에 게시하지 않았기 때문입니다. crossdomain.xml과 clientaccesspolicy.xml 둘 중에 하나를 작성하여 WebService Server의 Root에 올려두시면 됩니다. crossdomain.xml은 Flesh 측에서 사용했던 ‘상호 도메인 정책파일’로서 Silverlight에서도 사용가능 하지만 대부분의 고급 옵션들의 사용이 제한됩니다. clientaccesspolicy.xml은 WCF가 Silverlight를 위해서 제공하는 ‘상호 도메인 정책파일’입니다. Silverlight개발을 하신다면 clientaccesspolicy.xml을 작성하여 사용하시면 됩니다.
    clientaccesspolicy.xml
    <?xml version="1.0" encoding="utf-8"?>
    <access-policy>
        <cross-domain-access>
        <policy>
            <!-- http-request-headers를 설정하여 특정 헤더를 포함하는 요청만 허용할 수 있습니다. -->
            <allow-from http-request-headers="*">
                <!-- 어떤 도메인에 대해서 Service를 허용할 것인가. 아래는 전체 도메인에 대한 허용 -->
                <domain uri="*"/>
            </allow-from>
            <grant-to>
                <!-- 어떤 자원을 허용할 것인가. -->
                <resource path="/" include-subpaths="true"/>
            </grant-to>
        </policy>
      </cross-domain-access>
    </access-policy>
    crossdomain.xml
    <?xml version="1.0"?>
    <!DOCTYPE cross-domain-policy SYSTEM
      "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
    <cross-domain-policy>
      <allow-http-request-headers-from domain="* " headers="*" />
    </cross-domain-policy>
    둘 중에 하나만 넣거나 둘 다 넣어도 동작하며, 가장 유의해야 할 것은 Web Service서버의 루트에 파일을 올려두는 것입니다!
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Tag : exception, Silverlight, WCF

name    password    homepage
 hidden


[WCF] '원격 서버에서 오류를 반환했습니다. NotFound' 오류

 

WCF Service를 Silverlight에서 사용할 때 위와같은 ‘CommunicationException’, ‘원격 서버에서 오류를 반환했습니다. NotFound’일 경우에 해결책은 다음과 같습니다.

  1. WCF의 DB ConnectionString을 구성할 때 Windows 인증을 사용했을 경우에 발생합니다. 즉, ConnectionString는 ID와 Password를 통한 인증을 사용해야 합니다. 아래는 ID Password인증으로 구성한 ConnectionString와 Windows인증으로 구성한 예입니다.
    <!-- ID Password 인증 -->
    <add name="Correct" connectionString="Data Source='localhost, 1433';Initial Catalog=DbName;Persist Security Info=True;User ID=sa;Password=dev123#s" providerName="System.Data.SqlClient" />
    
    <!-- Windows 인증 --> 
    <add name="Wrong" connectionString="Data Source='localhost, 1433';Initial Catalog=DbName;Integrated Security=True" providerName="System.Data.SqlClient" />
  2. 두번째로 이 에러가 발생하는 이유는(가장 흔한 종류) WCF의 코드에 에러가 있거나, 없는 개체를 참조하려 했기 때문에 나타납니다. 따라서 이 에러를 내면 호출 한 개체가 실제로 WCF에 존재하는지, 또는 해당 개체가 에러를 내지는 않는지 확인 및 조치가 필요합니다.
  3. 전송할 수 있는 Buffer보다 큰 데이터를 전송했을 때 발생합니다. 이 설정은 WCF에 있는 Web.Config의 BufferSizer를 늘림으로서 해결가능합니다.
  4. WCF에 있는 DBML의 'Serialization Mode'를 'Unidirectional'로 설정하지 않은 상태에서 DBML의 DataClass를 Client로 반환하려 할 때 발생하는 문제입니다. DBML에서 'Serialization Mode'를 'Unidirectional'로 변경하십시요.

 

Author : thankee

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Tag : exception, Silverlight, WCF

name    password    homepage
 hidden


 Category
분류 전체보기 (95)
Netwrok & Security (6)
Web Development (61)
Database (5)
Framework (6)
Others (17)
About (0)
 TAGS
web tier class id 차이 ajax ebnf WCF 오라클 PHP 강좌 영국 홈스테이 data tier linux UpdateProgress 특수문자 영국 학원 리눅스 MS SQL Server 영국 인턴쉽 SourceSafe Internet application error #401 XML It's me c#.net RFC 4180 smarty SourceSafe2005 mantis id name 차이 Blog API DTD Silverlight ASP ie6 자바스크립트 버그 php mantis bug tracker 자바스크립트 ASP.NET maxRecievedMessageSize exception LiveMail 오라클 구조 ATRIX
 Calendar
«   2017/08   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
 Visitor Statistics
Total : 244,497
Today : 27
Yesterday : 100
rss
 

티스토리 툴바