2009-10-29 2 views
6

Visual Studio 2008에서 약 12 ​​개의 메서드가 포함 된 WCF 서비스 프로젝트가 있는데 그 중 일부는 bool 또는 string과 같은 기본 형식을 반환합니다. 또한 WCF 서비스를 참조하는 Visual Studio Unit Test Project도 있습니다. 모든 반환 유형이 프리미티브 인 경우 테스트 프로젝트가 성공적으로 컴파일됩니다.사용자 지정 클래스를 반환하는 WCF 서비스가 Reference.cs에서 오류를 생성합니다.

사용자 지정 클래스를 반환하는 서비스에 새 메서드를 추가하고 테스트 프로젝트에서 서비스 참조를 게시하면 컴파일되지 않습니다. 오류는 다음과 같습니다. -

  1. 'PublisherFaultException'유형에 'Reason'에 대한 정의가 이미 있습니다.
  2. 'PublisherFaultException'유형에 이미 'PropertyChanged'에 대한 정의가 포함되어 있습니다.
  3. 'Publisher.Test.LibraryReference.PublisherFaultException'유형은 이미 동일한 매개 변수 유형으로 'RaisePropertyChanged'멤버를 정의합니다.

모두 자동 생성 된 reference.cs 파일에 있습니다. WCF 서비스의 방법

계약은 다음과 같습니다 -

Page GetItem(string path); 

및 페이지 클래스는를 DataContract 특성을 가지고 있으며 공용 속성이 DataMember를 속성이 있습니다.

서비스가 업데이트 될 때마다이 작업을 수행해야하므로 Reference.cs 파일을 수정하기가 쉽지 않습니다.

왜 이런 일이 발생하는지 알고 계십니까?

스튜어트.

+0

무슨 일이 일어나고있는 것은 WCF 서비스 참조 추가가 암캐라는 것입니다. 나는 당신의 고통을 느낍니다. – JohnIdol

+0

svcutil을 사용하여 프록시를 생성하려 했습니까? 이전에이 문제가 발생했음을 기억합니다. FaultContract 특성을 사용하여 사용자 지정 오류 예외를 만들었습니다. 나는 그 해결책을 기억하지 못한다. 그래서 잘하면 내 의견이 도움이 될 수 있습니다. 나는 파기를 계속하고 해결책을 찾을 수 있는지 알아볼 것입니다. SvcUtil.exe를 실행하여 발생한 문제를 확인하고 저희에게 알려주십시오. – CkH

답변

1

서비스 참조를 추가하면 '어셈블리에서 재사용 유형'옵션이 표시됩니다.이 옵션은 복제를 분류하는 데 중요한 역할을합니다.

또는 복제를 일으키는 테스트 참조가 있습니까?

또한 프로젝트 트리의 References 섹션을 살펴보고 예기치 않은 것이 있는지 살펴보십시오. 두 어셈블리 모두에 동일한 네임 스페이스에 서비스 참조가 포함되어있는 참조가 있습니까?

+0

"모든 참조 어셈블리에서 재사용 유형"이 선택되었습니다. 이것이 사실인가? Page 클래스는 VS 솔루션에있는 동안 테스트 프로젝트에서 직접 참조하지 않는 어셈블리에 속합니다. –

+0

재사용은 잘 작동하지만, 이런 식으로 계약을 공유하지 않도록주의를 기울여야한다는 주장이 있습니다. 계약 어셈블리에서 PublisherFaultException이 발생합니까? 적절한 계약 속성으로 표시되어 있습니까? (나는 당신이보고있는 정확한 경우를 보지 못했지만, 나는 참고 문헌의 흔적을 따라 가며 뿌리를 뽑을 것이다.) 프로젝트 탐색기의 상단에있는 모든 파일 표시 버튼을 클릭하고 references.cs를보고 생성 된 코드를 확인하여 충돌이 무엇인지 판단하십시오. –

+0

서비스 참조를 업데이트 할 때 PublisherFaultException은 자동 생성 Reference.cs 파일에 있습니다. 이 클래스에는 PublisherFaultException에 대한 두 클래스 선언 (부분 클래스 모두 괜찮음)이 있지만 공용 Reason 속성, PropertyChanged 이벤트 및 RaisePropertyChanged 메서드가 있습니다. 실제 ReportPublisherException 클래스 자체는 WCF 프로젝트에 있으며 DataContact 및 DataMember 특성을 갖습니다. –

1

자동 생성 프록시 클래스를 사용하면 항상 고통 스럽습니다.

이와 같은 상황을 처리하려면 데이터 계약 클래스와 서비스 인터페이스가있는 별도의 어셈블리를 사용해야합니다.

계약 dll은해야합니다 :


public interface IService 
{ 
    [OperationContract] 
    List GetContentList(); 
} 

[DataContract] 
public class ContentItem 
{ 
    [DataMember] public string Name; 
    [DataMember] public object Data; 
} 

클라이언트가 Contract.dll에 대한 참조를해야합니다. 프록시는 수동으로 생성 될 것이다


class ServiceProxy : ClientBase<IService>, IService 
{ 
    public List GetContentList() 
    { 
    return Channel.GetContentList(); 
    } 
} 

서버 DLL 동일한 계약 DLL에 대한 참조를 가질 것이다. 자동 생성 된 프록시로 인한 오류를 피할 수 있습니다. 또한 수동으로 만든 프록시는 더 간단하고 관리하기 쉽습니다.

0

서비스 참조를 추가 할 때 고급을 클릭하고 "비동기 작업 생성"을 선택하십시오.

웹 서비스에 Reason.cs에서 생성 된 메서드와 충돌하는 "Async"로 끝나는 비동기 메서드가 있다는 것을 생각합니다.

웹 서비스가 (1) SayHello 및 (2) SayHelloAsync의 두 가지 방법이 있다고 가정합니다. 기본 작업 기반 방법을 사용하여 생성

는 생산 :

  • SayHello와 (1)
  • SayHelloAsyncSayHelloAsyncAsync에 대한 SayHelloAsync을 (2).

SayHelloAsync이라는 2 개의 생성 된 메서드가 있었기 때문에 충돌이 발생했습니다.

나는 그것이 적어도 계속되고 있다고 생각한다. 어쨌든 "비동기 작업 생성"설정은 저에게 효과적이었습니다.

관련 문제