2014-02-17 3 views
0

인터페이스 전용 WCF 서비스를 만들 수도 있습니까? 내 이유는 이것에 대한 이유는 서버가 DataContracts 및/또는 KnownTypes의 새로운 DLL로 업데이트 될 때마다 클라이언트가 새로운 구체화 구현을 할 때마다이를 업데이트하지 않아야한다는 것입니다.이를 수행 할 수있는 방법이 있습니까? WCF에서도 가능합니까? (클라이언트와 서버에있는)WCF 인터페이스 전용 서비스

예 인터페이스 : IRequest의

[ServiceContract] 
public interface IProcessingService 
{ 
    [OperationContract] 
    IResponse Process(IRequest request); 
} 

public interface IRequest { ... } 

public interface IResponse { ... } 

없음 구현은 서버 측에 존재하는 것이고, IProcessingService/IResponse은 서버 측에서 구현 될 수있다.

[DataContract] 
internal class ProcessingTypeARequest : IRequest { ... } 

[DataContract] 
internal class ProcessingTypeBRequest : IRequest { ... } 

내 목표는 클라이언트에 존재 IRequest의 구체적인 구현을 가지고, 그래서 난 단지 통신에 클라이언트와 서버를 싶습니다

예를 DataContract 구현 (전용 클라이언트 측 존재) 인터페이스를 사용하여. 이것은 가능한가?

나는 System.ServiceModel.CommunicationException 항상이 유사한 오류 메시지와 함께 런타임에 발생하기 때문에 그것이 가능하지 않다 의심 다음 InnerExceptionMessage이었다 매개 변수 요청을 직렬화하는 동안 오류가 발생했습니다

'형식 ProcessingTypeARequest with 데이터 계약 이름 ProcessingTypeARequest가 필요하지 않습니다. DataContractResolver를 사용하거나 알려진 유형의 목록에 정적으로 알지 못하는 유형을 추가하는 것이 좋습니다. 예를 들어 KnockTypeAttribute 속성을 사용하거나 DataContractSerializer에 전달 된 알려진 유형 목록에 추가합니다.

+2

클라이언트는 서비스의 기능을 지시해서는 안됩니다. 그렇지 않으면, 나는 서버에 혼란을 가져 오는'MaliciousRequest' 구현을 가질 수 있습니다. – cadrell0

답변

1

내가 아는 한, 설명하는 방식으로 "인터페이스 전용"WCF 서비스를 가질 수 없습니다.

일반적인 WCF 패턴은 "IRequest의 구체적인 구현"을 거의 데이터 컨테이너가 아니라 메서드 또는 비즈니스 논리와 함께 사용하는 것입니다. [DataContract] 개체의 목적은 단순히 WCF 호출로 보내거나 보내지는 데이터를 나타내는 속성 목록을 포함하는 것입니다.

WCF 클라이언트는 클라이언트가 데이터를 (콘크리트) [DataContract] 개체로 전송하여 호출 할 때까지 데이터를 처리 할 수있는 고유 한 메서드 또는 클래스를 제공합니다. 그런 다음 클라이언트는 반환 된 객체를 가져 와서 데이터를 처리하는 데 사용하려는 클래스로 데이터를 다시 전송합니다.

[ServiceContract] 
public interface IProcessingService 
{ 
    [OperationContract] 
    ProcessingResponse Process(ProcessingRequest request); 
} 

[DataContract] 
public class ProcessingResponse 
{ 
    public bool Success { get; set; } 
    public string Result { get; set; } 
} 

[DataContract] 
public class ProcessingRequest 
{ 
    public int ProcessNumber { get; set; } 
    public string ProcessInput { get; set; } 
} 

[ServiceContract]는 구현이 서버 측을 정의하는 interface입니다 :

는 다음과 같은 예를 들어이 보일 수 있습니다 무엇. [DataContract] 멤버는 메서드 호출에 필요한 매개 변수의 정의입니다.[DataContract] 변경

[OperationContract] 
ProcessingResponse Process(int processNumber, string processInput); 

로 정의하는 의미 상당

[OperationContract] 
ProcessingResponse Process(ProcessingRequest request); 

같은 서비스 방법을 정의하는, 본 실시 예에 따라서 방법의 특성 변화에 의미 등가이므로 [DataContract] 만해야 IProcessingRequest도 변경해야하는 상황에서 변경해야합니다.