2014-03-07 10 views
0

WCF 서버에서 권한 부여를 사용자 지정하려면 ServiceAuthorizationManager.CheckAccessCore()를 재정의합니다. 그것에서 나는 OperationContext를 사용하여 클라이언트에 의해 호출 된 메소드를 찾아야한다. WCF: Retrieving MethodInfo from OperationContextOperationContext에서 WCF 검색 메서드 이름 및 매개 변수 형식을 검색합니다.

내 경우 (간체) 다음과 같습니다 : 포스트 위에서 MethodInfo를 얻을 수

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    void Hello(string name); 
} 

public Class MyService : IMyService 
{ 
    // this method is not part of service contract 
    public void Hello() 
    { 
     Console.WriteLine("Hello World!"); 
    } 

    public void Hello(string name) 
    { 
     Console.WriteLine(string.Format("Hello {0}!", name); 
    } 
} 

코드는 다음과 같습니다

string action = operationContext.IncomingMessageHeaders.Action; 
DispatchOperation operation = 
    operationContext.EndpointDispatcher.DispatchRuntime.Operations.FirstOrDefault(o => 
     o.Action == action); 

Type hostType = operationContext.Host.Description.ServiceType; 
MethodInfo method = hostType.GetMethod(operation.Name); 

때 안녕하세요 (I 부분이 우수한 게시물에 해결책을 발견 "Jake")가 호출되면 operationContext.IncomingMessageHeaders.Action은 메서드 이름 "Hello"를 제공하지만 올바른 메서드를 얻으려면 매개 변수 유형도 필요합니다. (hostType.GetMethod (operation.Name)) AmbiguousMatchException을 던졌습니다.

OperationContext에서 매개 변수 유형을 가져올 수 있습니까?

답변

0

WCF에서 상속의 개념은 인터페이스로 제한되며 WCF의 서비스 클래스 수준에서는 상속 개념을 사용할 수 없습니다. 회원님이 행복하게 작업 속성이 아니라 방법/함수 매개 변수에 대한 걱정에 의존 할 수 있도록 기능을 직접 오버로드 할 수 있습니다 심지어 http://www.codeproject.com/Questions/302481/WCF-Service-Inharitance

  1. WCF를 참조하십시오. 심지어 당신의 서비스에서 같은 이름의 함수를 사용하고 싶다면 "OperationContract"의 Action 데코레이터/속성을 사용하여 클라이언트에게 노출되는 새로운 이름을 제공해야합니다. 희망이 당신의 혼란을 해결하는 데 도움이됩니다.
+0

기본 클래스는 WCF 서비스가 아닙니다. WCF 서비스 클래스의 기본 클래스 일뿐입니다. 그것은 오해를 불러 일으켰 기 때문에 질문에서 상속의 소음을 제거했습니다. 바라건대 지금은 분명합니다. – sz9

+0

답변을 업데이트했습니다. 확인해주십시오. –

+0

내 시나리오에서는 하나의 오버로드 된 메서드가 서비스 작업으로 지정되고 다른 메서드는 그렇지 않습니다. 나는 서비스 클래스에서 오버로드 된 메소드를 피하기 위해 코드를 재구성 할 수 있지만 가능하다면 그것을 피하기 위해 다른 복잡성을 도입 할 것이다. – sz9