2014-12-18 1 views
4

왜 [OperationContract] 속성을 wcf 서비스의 개인 메소드에 넣을 수 있습니다. 내 프로그래밍의 시작부터 개인 수업은 수업 외부에서 접근 할 수없는 수업이라고 가르쳐 왔습니다. 이제 WCF 서비스에서 공개적으로 개인 메서드를 노출 할 수 있습니다.왜 WCF 서비스에 공개적으로 개인 메서드를 노출시킬 수 있습니까?

[ServiceContract] 
    public class MyServices 
    { 
     [OperationContract] 
     private int add(int a,int b) 
     { 
      return a + b; 
     } 
    } 
+2

당신은이 속성으로 방법을 표시 할 수 있지만, 서비스 클라이언트에 표시되지 않습니다 :

는 DataContract의 DataMember를로 노출됩니다 다음과 같습니다. –

+4

* 실제로 * WCF를 통해 호출 가능하다는 것을 확인 했습니까? (아마도 그럴 수도 있습니다 - 시도하지 않았습니다.) 근본적으로 "이 속성은 공용 멤버에게만 적용 할 수 있습니다"라는 말은 없습니다. –

+0

그렇다면 이것을 사용하지 않는 이유는 무엇입니까? – bilal

답변

6

확실하지이가이 방법을 설계하지만 소스를 선택하면, 라인 (336)은

internal const BindingFlags ServiceModelBindingFlags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance;

참고 특히 비공개 플래그를 말한다 왜 . 나는 당신과 동의

static List<MethodInfo> GetMethodsInternal(Type interfaceType) 
    { 
      List<MethodInfo> methods = new List<MethodInfo>(); 
      foreach (MethodInfo mi in interfaceType.GetMethods(ServiceModelBindingFlags)) 
      { 
       if (GetSingleAttribute<OperationContractAttribute>(mi) != null) 
       { 
        methods.Add(mi); 
       } 
       ... 

를이 이상한 결정이다하지만 WCF 개발자들 명시 적으로 포함하여이 방법을하기로 결정 : 다음은 WCF 알아낼 반사를 사용하고있을 때 어떤 방법 노출 라인 678 나중에 사용됩니다 NonPublic 플래그.

http://referencesource.microsoft.com/#System.ServiceModel/System/ServiceModel/Description/ServiceReflector.cs,c1358e6f97071bfa

+0

로버트, 확실하지 않은 사람들을 위해 WCF가 Reflection –

+0

을 통해 서비스 메소드를 호출한다고 설명해야합니다 @JohnSaunders - tweak made –

4

그것은 작동 찾는 재미있다. 확실히 개인 액세스 수정자를 사용하여 클래스의 고객이 표시된 멤버에 액세스하는 것을 거부합니다. 그러나 WCF는 OperationContract 속성으로 표시 한 모든 방법을 공개합니다. 로버트 레비 (Robert Levy)가 알아 냈 듯이, 그런 식으로 구현됩니다. 마찬가지로 presentation about WCF에있는 일부 정보, 특히 slide no. 36을 찾을 수 있습니다.

MSDN article about implementing WCF service을 확인하면 개인 메서드에서 OperationContract 특성을 사용할 수 있습니다. 클래스는 인터페이스의 메소드를 구현해야하기 때문에 오타가있는 것처럼 보입니다.

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    string GetData(); 
} 

public class MyService : IMyService 
{ 
    public string GetData() { ... } 
    private string ComputeData() { ... } // this one is not visible to clients 
} 
0

2 센트 :에 의해 사용되는

SOAP, 어쨌든

, 당신을위한 가장 안전한 방법은 개발자는 서비스 클래스 인터페이스에서 ServiceContractOperationContract 특성, 예를 사용하는 것입니다으로 WCF는 C#의 OOP 개념을 준수하지 않습니다. 또 다른 "이상"은 메서드 오버로드입니다.이 메서드는 매우 유용하고 널리 사용되는 C# 기능입니다. Service 클래스에서 메소드를 오버로드 할 수는 있지만 동일한 이름을 가진 두 개의 OperationContract를 가질 수는 없습니다 (서명이 다르더라도). 즉, SOAP을 통해 오버로드 된 메소드를 노출 할 수 없습니다. 이를 통해 범위 지정자는 SOAP 기능이 아니기 때문에 WCF는이를 무시하고 OperationContract 및 DataMember 특성을 사용하여 계약을 결정할 것을 제안합니다.

[DataMember] 
private int _personAge; 
관련 문제