2012-10-16 6 views
0

난에 대한 클라이언트 프록시 클래스를 생성 할 필요가 라이브러리를 가지고 있고,이 명령과 내 로컬 상자에서 서비스를 실행할 때 기존의 코드는 잘 작동WCF 클라이언트 프록시 생성

svcutil.exe /config:thn /r:Citi.Rbcs.BusGn.dll /r:Citi.Rbcs.Buscm.dll net.tcp://localhost:8088/RbcThnService/mex 

클라이언트 프록시가 올바르게 생성됩니다. RbcThnService는 IRbcThinService 인터페이스를 사용합니다.

다음
[OperationContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)] 
     [FaultContract(typeof (GenericException))] 
     [FaultContract(typeof (CustomException))] 
     RbcCustomerStructure GetCustomerStructures(string CustomerId, short QueueId, DateTime dateUpdate, RbcSecurityContext securityContext); 

재 구축하고 서비스를 설치하고 클라이언트 프록시를 재생하려고 다음과 같이 내가 그 인터페이스에 새로운 방법을 추가 할 경우, 나는

There is an error in the XML document. 

The value for the 'type' attribute is invalid - 'q32:ArrayOfstring' is an invalid value for the 'type' attribute. 

를 그것은을 찾지 못하는 것처럼 그것은 소리를 얻을 특정 유형의 선언에 있지만 이상한 점은 인터페이스에 클라이언트 프록시가 올바르게 생성 할 수있게 해주는 원본 라이브러리의 동일한 서명과 함께 다른 메소드가 있다는 것입니다. 그래서 저는 새로운 이름으로 이미 존재하는 것과 동일한 방법을 만들고 있습니다.

누구에게 의견이 있습니까?

업데이트 : 기존의 방법 중 하나라도 주석 처리하고 다시 시도하면 플롯이 두꺼워집니다. 새로운 방법으로 작동합니다. 나는 그것을 제거하는 것만으로 몇 가지 방법과 새로운 방법을 시도해 보았다. 나는 점진적으로 다른 방법을 하나씩 다시 도입했고 계속해서 작업을 계속했습니다. 마지막에 하나를 추가 할 때까지 오류가 발생했습니다.

흥미롭게도 원래 메서드가 주석 처리되어 작동한다는 것을 알았고 두 번째 더미 새 메서드를 만들었고 같은 오류가 발생했지만 ArrayOfstring 대신 다른 형식을 사용했기 때문에 실패했습니다 의.

그래서 내가 틀린 나무를 짖지 않는다면 인터페이스 정의에있는 메소드의 수나 생성 된 XML의 길이에 잠재적으로 연관되어있는 것처럼 보입니다. 내가 알아야 할 한계가 있습니까?

답변

0

모든 유형의 웹 서비스에 대해 오버로드 된 메서드를 사용할 수 없습니다. WCF는 다른 OperationContract Name E.G.를 지정하면이를 허용합니다.

[ServiceContract] 
interface IService 
{ 
    [OperationContract(Name="Foo")] 
    void Foo(); 

    [OperationContract(Name="Foobar")] 
    void Foo(string bar); 

} 

는하지만 이것은 기본적으로는 인터페이스의 같은 이름의 경우에도 방법에 공공 서명을 변화하고, 그래서 당신의 클라이언트를 만들 때 더 혼란 스러울 수 있기 때문에 나는 일반적으로 그냥 이렇게하지 않을 것입니다.

비슷한 문제에 대해 this post을 확인하십시오. 웹 서비스 (WCF 포함)에서 오버로드 된 메서드 (동일한 이름)는 문자 그대로 사용자가 호출하는 것을 파악하는 것은 사실상 불가능합니다. OperationContract의 메서드 이름이나 Name 특성을 다른 것으로 변경하고 다시 시도하십시오.

관련 문제