2012-04-12 3 views
4

내 웹 메서드에서 느슨하게 형식화 된 매개 변수가 필요합니다.느슨하게 형식화 된 매개 변수가있는 WCF OperationContract

나는 클라이언트가 25 개의 DataContract 개체 중 하나를 WCF 작업으로 보낼 수있는 시나리오를 가지고 있습니다.

proxy1.myFunction(PersonObject) 
proxy1.myFunction(ComputerObject) 

제한적으로 클라이언트에게 공개되는 하나의 운영 계약 만 있어야합니다.

25 개의 DataContract 클래스 중 하나를 매개 변수로 사용할 수있는 웹 메서드를 디자인하려면 어떻게해야합니까? 나는 object을 매개 변수의 유형으로 시도하고 DataContract 클래스에 KnownType 속성을주었습니다. 그러나 직렬화 프로세스 중에 운이 없었습니다.

답변

8

방금이 작업을 수행 했으므로 인터페이스에 KnownTypesAttribute를 추가해야합니다.

[ServiceContract] 
[ServiceKnownType(typeof(MyContract1)] 
[ServiceKnownType(typeof(MyContract2)] 
[ServiceKnownType(typeof(MyContract3)] 
public interface IMyService 
{ 
    [OperationContract] 
    object TakeMessage(); 

    [OperationContract] 
    void AddMessage(object contract); 

} 

구현시 사용자의 DataContracts 중 하나인지 확인하기 위해 유형을 확인해야합니다. 당신이 계약을 많이 가지고있는 경우

편집

, 당신은 KnownTypes에 추가 반사를 사용할 수 있습니다. 이것은 그 일을 훨씬 청소기 방법입니다

[ServiceContract] 
[ServiceKnownType("GetKnownTypes", typeof(KnownTypeHelper))] 
public interface IMyService 
{ 
    [OperationContract] 
    object TakeMessage(); 

    [OperationContract] 
    void AddMessage(object contract); 
} 

internal static class KnownTypeHelper 
{ 
    public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider = null) 
    { 
     var types = Assembly.GetExecutingAssembly().GetTypes().Where(a => a.Namespace == "Company.Path.To.DataContractsNamespace").ToArray(); 

     return types; 
    } 
} 

그런 다음 당신은 당신의 인터페이스를 선언 할 수 있습니다.

+0

아! 알겠습니다 ... 이것은 내가 찾고 있던 것입니다 ... 많은 분들이 그렇게 빠른 응답을 주셔서 감사합니다. – user1312242

+0

OMG !! 신난다. 이것은 less & 더 많이 쓰는 것처럼 들린다. 그러나 나는 반사가 조금의 성능 저하를 요구한다고 생각한다. ... – user1312242

1

당신이 시도 할 수있는 한 가지 방법은 IObj와 같은 인터페이스를 만들고 25 개의 다른 데이터 계약 객체에 대해이 인터페이스를 구현하는 것입니다. 그런 다음 작업 계약에 대해 매개 변수 유형을 IObj로 지정하십시오. 이렇게하면 25 개의 매개 변수를 보내는 데 도움이됩니다.

+0

ohh 이것은 greate 아이디어 다. 나에게 같은 것을 impliment하게해라.. 그러나 나는 질문 ie가 말한다. 인터페이스 IObj에는 두 가지 연산이 있으며, 모든 datacontract 클래스가이를 구현해야한다. 또 다른 관심사는 다음과 같습니다. webmethod가 IObj를 매개 변수 유형으로 사용했다고 가정 해보십시오. 이제 WCF 클라이언트가 WCF Side에서 typecasting 한 후 해당 WebMethod에서 ComputerObject를 전송하면 IObj 유형의 Object를 얻을 수 있습니다. 밖으로 몇 가지 속성을 거기에없는 IObj .. 만약 내가 틀렸다면 ... 제발 정정 해주세요 ... 어쨌든 letme 시도 ... 도움을 많이 :-) – user1312242

+0

WCF 운영 계약에서 당신이해야 할 일은 무엇입니까? 모든 유형에 대해 객체를 확인하고 형변환하십시오. 이 방법으로 IObj가 아닌 ComputerObject를 얻을 수 있습니다. 하지만 그렇습니다. 25 가지 유형의 체크에 대해서는 추가 오버 헤드가 될 수 있습니다. – Krishna