[wpf] 이 WCF 오류의 의미 : “사용자 지정 도구 경고 : wsdl : portType을 가져올 수 없습니다.”

내 솔루션에서 WCF 서비스 라이브러리 프로젝트를 만들고 이에 대한 서비스 참조가 있습니다. 클래스 라이브러리의 서비스를 사용하므로 클래스 라이브러리 외에도 WPF 응용 프로그램 프로젝트의 참조가 있습니다. 서비스는 간단하게 설정되며 비동기 서비스 기능을 얻기 위해서만 변경됩니다.

서비스 참조를 업데이트하고 싶을 때까지 모든 것이 잘 작동했습니다. 실패했기 때문에 결국 롤백하고 다시 시도했지만 그때도 실패했습니다! 따라서 서비스 참조 업데이트는 변경하지 않고 실패합니다. 왜?!

내가 얻는 오류는 다음과 같습니다.

Custom tool error: Failed to generate code for the service reference
'MyServiceReference'.  Please check other error and warning messages for details.

경고는 추가 정보를 제공합니다.

Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension:
System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: List of referenced types contains more than one type with data contract name 'Patient' in  
namespace 'http://schemas.datacontract.org/2004/07/MyApp.Model'. Need to exclude all but one of the 
following types. Only matching types can be valid references:
"MyApp.Dashboard.MyServiceReference.Patient, Medski.Dashboard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
"MyApp.Model.Patient, MyApp.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISomeService']

다음과 같은 두 가지 유사한 경고도 있습니다.

Custom tool warning: Cannot import wsdl:binding
Detail: There was an error importing a wsdl:portType that the wsdl:binding is dependent on.
XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISomeService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_ISomeService']

그리고 동일 :

Custom tool warning: Cannot import wsdl:port ..

이 모든 것이 혼란 스럽습니다. 서비스 참조를 통해 얻은 것 외에는 클라이언트 측 대시 보드에 Patient 클래스가 없습니다. 그래서 그것은 무엇을 의미합니까? 그리고 왜 갑자기 표시됩니까? 기억하십시오 : 나는 아무것도 변경하지 않았습니다!

이제 이것에 대한 해결책이 여기 에서 발견 되었지만 이것이 의미하는 바에 대한 설명은 없습니다. 그래서; 서비스에 대한 “서비스 참조 구성”에서 “참조 된 어셈블리의 유형 재사용”확인란을 선택 취소합니다. 지금 재건하면 문제없이 잘 작동합니다. 그러나 내가 정말로 무엇을 바꿨습니까? 이것이 내 응용 프로그램에 영향을 미칠까요? 그리고 언제 이것을 선택 취소해야합니까? DataContract를 설정 한 유형을 재사용하고 싶지만 더 이상은 사용하지 않습니다. 이 항목을 선택하지 않아도 계속 액세스 할 수 있습니까?



답변

서비스 참조를 추가 할 때 서비스에서 사용하는 유형을 처리 할 수있는 두 가지 방법이 있습니다.

  • 유형은 dll에 저장되며 해당 dll은 클라이언트와 서버 응용 프로그램 모두에서 참조됩니다.
  • 클라이언트가 참조하는 dll에 유형이 없습니다. 이 경우 서비스 참조를 생성하는 도구는 references.cs 파일에 유형을 생성합니다.

잘못 될 수있는 것들이 많이 있습니다. 도구가 충돌하면 때때로 서비스 참조를 삭제하고 다시 시작하는 것이 더 빠르다는 것을 발견했습니다.

서비스 참조 사용을 중지했습니다. 클라이언트와 서비스를 제어 할 수있는 프로젝트의 경우이 스크린 캐스트에 설명 된 방법을 사용합니다 .


답변

내 대답은 http://www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html 에서 찾았습니다.

간단히 말해서 , 고급 메뉴 에서 참조 어셈블리 에서 유형 재사용을 선택 취소했습니다 .


이것이 중요한지 모르겠지만 MVC가 아니라 Web Forms를 사용하고 있습니다.


답변

오늘도이 문제가있었습니다. 실수를 찾는 데 하루 종일 걸렸습니다. 도움이 되었기를 바랍니다.

가져올 수 없었던 내 클래스에 cutom enum 유형 속성이 있습니다. 이 속성은 DataMember로 표시되고 Enum은 DataContract로도 표시됩니다. 지금까지는 괜찮습니다. 모든 열거 형 멤버를 EnumMember로 표시하는 것을 잊었습니다.

그래서 나는 변했다

[DataContract]
public enum SortMethodType
{
    Default = 0,
    Popularity = 1,
    ReleaseDate = 2,
    PublishedDate = 3,
    TranslatedTitle = 4,
    OriginalTitle = 5,
    UserRating = 6,
    Duration = 7
}

이에:

[DataContract]
public enum SortMethodType
{
    [EnumMember]
    Default = 0,
    [EnumMember]
    Popularity = 1,
    [EnumMember]
    ReleaseDate = 2,
    [EnumMember]
    PublishedDate = 3,
    [EnumMember]
    TranslatedTitle = 4,
    [EnumMember]
    OriginalTitle = 5,
    [EnumMember]
    UserRating = 6,
    [EnumMember]
    Duration = 7
}

그리고 마침내 작동했습니다!


답변

참조를 추가하면서 고급 속성으로 이동하고 체크리스트에서 “System.Window.Browser”를 제거하면 문제가 해결됩니다.


답변

이상하게 들릴 수 있지만 참조를 삭제 한 다음 Visual Studio를 닫은 다음 다시 열고 마지막으로 참조를 다시 추가하여 문제를 해결했습니다.

사용자 지정 도구를 다시 시작해야한다고 생각합니다.


답변

다른 개발자 컴퓨터에서 작동하는 동안이 오류가 계속 발생합니다. 가상 머신의 모든 곳에서 전체 관리자이지만 Visual Studio를 닫고 ‘관리자 권한으로 실행’으로 다시 열려고했는데 마술처럼 작동했습니다.

행운을 빕니다.


답변

내 솔루션을 Visual Studio (VS) 2010에서 2013으로 업그레이드하고 각 프로젝트의 .NET Framework를 4에서 4.5.1로 변경 한 후 경고를 받았습니다. VS를 닫고 다시 열었고 경고가 사라졌습니다.