그래서 WCF 서비스에서 엔터프라이즈 라이브러리를 사용하여 예외 관련 작업을 수행하려고합니다.맞춤 예외 처리기를 사용하여 FaultException을 throw EL WCF
내 생각은 "NullReferenceException"에 대해 "사용자 정의 예외 처리기"을 설정하고 "사용자 지정 예외 처리기"에서 FaultException 예외를 생성하는 것입니다.
제 생각에이 "새로운"예외는 전선을 가로 지르며 클라이언트에서이를 잡아낼 것입니다.
더 나은 이해를위한 몇 가지 코드 :
WCF 서비스 :
[ServiceContract(Name="MyService", ConfigurationName="MyNamespace.MyService")]
[ExceptionShielding("PolicyName")]
public interface IMyService
{
[OperationContract]
[FaultContract(typeof(MyFaultContract))]
string Method(String Param);
}
public class MyService : IMyService
{
public string Method(String Param)
{
throw new NullReferenceException("code-created null message here");
}
}
사용자 정의 예외 처리기 (엔터프라이즈 라이브러리)
public class MyExceptionHandler : IExceptionHandler
{
public MyExceptionHandler(NameValueCollection collection) { }
public MyExceptionHandler() { }
public System.Exception HandleException(System.Exception exception,
Guid handlingInstanceId)
{
MyFaultContract details = new MyFaultContract();
if (exception is NullReferenceException)
{
details.ErrorCode = MyFaultCode.NullReferenceException;
details.OriginalMessage = exception.Message;
details.MyMessage = "Null Reference exception here!";
}
return new FaultException<MyFaultContract>(details);
}
}
NullReferenceException이 매핑
응용 프로그램 구성 파일에 "사용자 정의 예외 처리기 ":
<exceptionPolicies>
<add name="PolicyName">
<exceptionTypes>
<add name="NullReferenceException" type="System.NullReferenceException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
postHandlingAction="ThrowNewException">
<exceptionHandlers>
<add type="MyExceptionHandler, MyApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
name="MyExceptionHandler" />
</exceptionHandlers>
</add>
</exceptionTypes>
</add>
</exceptionPolicies>
,363,210
그리고이 오류 예외 잡을 것으로 기대 마지막으로 클라이언트 코드 :
MyService.MyServiceClient client = new MyService.MyServiceClient();
client.Open();
try
{
string result = client.Method(string parameter);
}
catch (System.ServiceModel.FaultException<MyService.MyFaultContract> ex)
{
// where I think exception should end up
}
catch (System.ServiceModel.FaultException ex)
{
// general FaultException
}
하지만 그 대신 내가 응답 조치가 필요하다고 주장하는 ProtocolException 사용을 얻을 :
응답 메시지가 작동받은 '를 방법 '행동으로'. 그러나 클라이언트 코드는 'http://tempuri.org/MyService/MethodResponse'조치가 필요합니다.
내가 뭘 잘못하고 있니? "Custom Exception Handler"에서 사용자 정의 FaultContract를 사용하여 FaultException을 리턴 (명시 적으로 던지지 않음) 할 수 있습니까?
모든 조언을 주시면 감사하겠습니다.
업데이트 : "사용자 지정 예외 처리기"의 사후 처리 작업은 "ThrowNewException"로 설정됩니다. "NotifyRethrow"로 변경하면 더 이상 "ProtocolException"을 het하지 않습니다! 대신 클라이언트는 일반적인 "FaultException"(사용자 정의 유형이 아님)을 포착합니다.
이제는 원래 사용자 정의 유형의 FaultException이 전선을 가로 지르지 않는 이유가 여기에 있습니다.
업데이트 내가 언급하는 것을 잊었다 2 것은 내 WCF 서비스가되지 IIS에서, ServiceHost를 내에서 실행되고있는 사실이다. 따라서 기본적으로 ServiceHost를 만들고이 ServiceHost를 통해 Service1 인터페이스를 제공하는 Windows 서비스가 있습니다.
이것이이 문제와 관련이 있다고 생각하는 이유는 엔터프라이즈 라이브러리가 서비스 경계 내에서뿐만 아니라 전체 응용 프로그램에서 예외를 처리한다고 주장하기 때문입니다. 어쩌면 이렇게하면 예외가 너무 늦게 던질 수 있습니까? 아니면 올바른 수준으로?
업데이트 3
게시물을 보내 주셔서 감사합니다! 맞습니다. MyFaultCode 값을 설정하기 때문에 커스텀 핸들러가 엉망입니다. 2 명의 처리기를 구성하여 귀하의 충고를 시도했습니다.
First는 사용자 지정 처리기이며 NullReference 예외를 catch합니다. MyFaultContract 필드와 함께 MyApplicationException이라는 새로운 예외를 throw합니다.
그런 다음 MyApplicationException을 포착하고 새 FaultException을 만들고 MyApplicationException에서 MyApplicationException을 새로 생성 된 FaultException에 자동으로 매핑하는 기본 제공 "오류 계약 예외 처리기"를 구성했습니다.
WCF 클라이언트는 여전히 사용자 지정 계약서가 아닌 일반적인 FaultException을 catch합니다.
이 솔루션을 지적 해 주셔서 감사합니다. 나는 그것을 시험해 보았다. 그리고 내가 지금 필요로하는 것을하는 것처럼 보인다. 그것은 정말로 느껴진다. 예외를 와이어에 적용하고 일부 로직을 실행하려고 할 때 순간을 포착하고 있음을 의미합니다. 다른 팀 구성원에게는 정확하지 않을 수 있지만 필요한 것은 분명합니다. 다시 한번 고마워! – iEddie