일부 데이터 계약을 공유하고 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.
시작하여
로 끝나는, 중복 데이터 유형에 대한 많은 오류 메시지가 발생합니다 :이 같은 -는 svcutil 명령 행에서 두 서비스 모두 포함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 /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 명령 줄 (또는 다른 명령 줄 도구)이 필요합니다.
그러나 그것은 어느 쪽의 상황도 아닙니다. 명령 줄에서 svcutil에 여러 끝점을 지정하면 여러 서비스에서 DTO를 다시 사용하는 출력 파일 집합을 하나 생성 할 수 있습니다. 어셈블리를 서비스 측면에서 재사용 할 필요가 없으며 각 서비스가 동일한 객체의 자체 복사본을 가질 필요가 없습니다. – Bevan