2014-07-25 1 views
2

에서 호출 된 서비스 방법을 얻을 수 있습니다 :어떻게이 모든 요청에 ​​호출되는 WCF 인터셉터가 AfterReceiveRequest

public class WebServiceInterceptor : IDispatchMessageInspector 
{ 
    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
    { 
     var action = OperationContext.Current.IncomingMessageHeaders.Action; 
     var name = instanceContext.GetServiceInstance().GetType().Name; 
     if (action != null) 
     { 
      var operationName = action.Substring(action.LastIndexOf("/", StringComparison.OrdinalIgnoreCase) + 1); 
     } 
     return null; 
    } 

    public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
    } 
} 

어떻게 호출 될 서비스 클래스의 메소드의 이름을 얻을 수 있나요? 이 메서드에서 특성을 가져 오려고합니다.

답변

0

: https://stackoverflow.com/a/5150194/1453662

string methodName = OperationContext.Current.IncomingMessageProperties["HttpOperationName"] as string; 
MethodInfo info = instanceContext.GetServiceInstance().GetType().GetMethod(methodName); 

이 (우리는 HTTP를 사용)

+0

특정 헤더가 설정되어 있지 않으면이 서비스가 SOAP을 통해 호출되는 경우에는 무시됩니다. –

+0

좋아, 우리는 SOAP를 사용하지 않지만 내 대답을 편집했다. –

1

모든 문자열 처리는 해킹이며 신뢰할 수 없습니다. WCF에서 제공하는 메타 데이터를 사용하는 방법을 익히십시오. 형식 이름에서 파싱 할 필요가 없습니다.

IDispatchMessageInspector을 등록 할 때 필요한 메타 데이터 (예 : OperationDescription)가있을 수 있습니다. 해당 정보를 클래스 생성자에 전달하고 인스턴스 필드에 저장합니다. 그러면 나중에 AfterReceiveRequest에서 해당 정보를 사용할 수 있습니다. 내가 여기에 대한 답을 찾을

+0

내 회사는 WCF의 많은 기능 그래서 난 해킹 할 필요가 사용하는 SOAP 요청을 작동하지 않습니다를 ... 왜 내 솔루션이 신뢰할 수 없습니까? –

+0

가장 먼저 떠오르는 것은 메서드와 형식 이름이 계약 및 작업 이름과 반드시 ​​일치하지 않는다는 것입니다. 그 외에도,이 코드에 대해 판단하고 그것이 옳다고 결론 짓는 것은 어렵습니다. 어떤 코너 케이스가 있는지 누가 알 수 있습니까? – usr

+0

우리는 아무런 계약도하지 않고 있습니다 ... 모서리의 경우가 있는지 테스트하고 볼 것입니다. –

관련 문제