2010-01-26 2 views
10

일부 데이터 계약을 공유하고 svcutil.exe를 사용하여 클라이언트 쪽 코드를 생성해야하는 여러 WCF 서비스가 있습니다. 이 작업을 수행하는 데 가장 분명한 두 가지 방법을 사용하여 오류가 발생했으며 도움이 필요합니다.공유 형식을 사용하여 여러 WCF 서비스에 대한 클라이언트 쪽 코드를 생성하는 방법

하지만 먼저, 여기에 서비스입니다 : 컴파일,

[DataContract(Namespace = "http://www.me.com/shared/")] 
public class Request { 
    [DataMember] 
    public int Input { get; set; } 
} 
[DataContract(Namespace = "http://www.me.com/shared/")] 
public class Response { 
    [DataMember] 
    public int Result { get; set; } 
} 

서비스는 몇 가지 사소한 방식으로 구현되어 출판 -하자 :

[ServiceContract(Namespace = "http://www.me.com/services/")] 
public interface IFooService { 
    [OperationContract] 
    Response RunFoo(Request request); 
} 
[ServiceContract(Namespace = "http://www.me.com/services/")] 
public interface IBarService { 
    [OperationContract] 
    Response RunBar(Request request); 
} 

응답 및 요청은 별도의 어셈블리에 정의되어있다가 이제 클라이언트 측으로 전환하십시오.

svcutil /o:Client.cs http://hostname.com/FooService.svc http://hostname.com/BarService.svc 

Error: There was a validation error on a schema generated during export: Source: Line: 1 Column: 9087 Validation Error: The global element ' http://schemas.microsoft.com/2003/10/Serialization/:anyType ' has already been declared.

시작하여

Error: There was a validation error on a schema generated during export: Source: Line: 1 Column: 12817 Validation Error: The complexType ' http://www.me.com/shared/:Response ' has already been declared.

로 끝나는, 중복 데이터 유형에 대한 많은 오류 메시지가 발생합니다 :이 같은 -는 svcutil 명령 행에서 두 서비스 모두 포함

각 서비스에 대해 클라이언트 측 파일을 별도로 생성하지 마십시오.

svcutil /o:Foo.cs http://hostname.com/FooService.svc 
svcutil /o:Bar.cs http://hostname.com/BarService.svc 

을하지만 (예 : 요청 및 응답 등) 공유 유형의 다음 정의는 컴파일러 오류가 분명히 결과, Foo.cs에 다음 Bar.cs에서 중복됩니다 이러한 오류를에요.

그래서 이러한 서비스를 사용하는 클라이언트 측 코드를 생성하는 일반적인 방법은 무엇입니까?

제한 :

  • 는 "서비스 참조 추가 ..."명령을 사용할 수 없습니다 (그들은 svcutil.exe에의의/r 옵션을 사용할 수 있도록) 클라이언트에 공유 유형을 포함하는 어셈블리를 배송 할 수 없습니다 Visual Studio - svcutil 명령 줄 (또는 다른 명령 줄 도구)이 필요합니다.

답변

5

음, 기본적으로 할 수 있습니다

  • 중 (이미으로 불가능 기각) 클라이언트 코드

또는 다음을 생성 할 때 클라이언트가 사용할 수있는 별도의 어셈블리로 공유 유형을 넣어 :

  • 서비스에 대한 각 프록시를 별도로 생성해야하며 각 서비스는 "요청"및 "응답"클래스의 "복사본"을 가져옵니다.

어느 쪽이든 당신은 일반적인 어셈블리를 공유 할 수 있습니다 - 또는 수 없습니다 - 정말, 어떤 다른 선택의 여지가 표시되지 않습니다.

+0

그러나 그것은 어느 쪽의 상황도 아닙니다. 명령 줄에서 svcutil에 여러 끝점을 지정하면 여러 서비스에서 DTO를 다시 사용하는 출력 파일 집합을 하나 생성 할 수 있습니다. 어셈블리를 서비스 측면에서 재사용 할 필요가 없으며 각 서비스가 동일한 객체의 자체 복사본을 가질 필요가 없습니다. – Bevan

4

(BTW, 왜?)는,이 경우 에있는 간단한 방법이 다른 C#을 네임 스페이스의 유형 (svcutil에 즉, 두 통화)를 생성 할 수 보이는 당신이 공유 DTO 어셈블리를 규칙을 가지고 있기 때문에, 그리고 둘 사이에 데이터를 매핑하십시오. 본질적으로 : 두 서비스의 DTO를 우연히 비슷하게 취급하십시오.

자동화 작업과 같은 작업을 사용하거나 작업 A를 직렬화하고 B 유형으로 직렬화 할 수 있습니다 (실제 데이터 네임 스페이스 등은 동일 함).

+0

서버와 클라이언트가 다른 조직에 있습니다. 따라서 모든 클라이언트에게 연락하여 DLL을 제공하거나 다운로드 가능한 또는 오픈 소스 제품으로 전환해야합니다. 어쨌든 개발자가 단순히 명령 행 옵션의 올바른 조합을 선택하는 것보다 더 많은 사람들이 참여하게되고 더 어렵고 비용이 많이 드는 결정이됩니다. – azheglov

0

일단 클라이언트 유틸리티를 실행하면 XXXXService.cs 및 output.config 파일이 생성됩니다.

XXXXService 클래스를 관찰하면 파일에 모든 항목이 있습니다. 별도의 IXXXService 및 XXXService 파일과 datacontracts 파일로 분리 할 수 ​​있습니다.

그럼 당신이 대답 할 수 있다면 당신은 내가 확실하지 않다 이러한 2.

에 대해 공유하는 데 사용할 수있는 두 번째 서비스의 유틸리티를 실행하고 IXXXService1.cs 및 1XXXService.cs 파일과 같은 datacontracts를 추가 할 수 있습니다 문제. 나는 an example을 도와 드릴 수 있습니다. 일부 MVC 및 WCF 관련 예제 인 here을 볼 수 있습니다.

2

WSCF Blue는 이미 솔루션을 찾지 못했다면 솔루션에 더 가까워 질 수 있습니다.

http://wscfblue.codeplex.com/

이 후속 작업에 덮어 쓰기, 각 유형에 대해 별도의 파일을 생성 할 수 있습니다.

관련 문제