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


84

내 솔루션에서 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를 설정 한 유형을 재사용하고 싶지만 더 이상은 사용하지 않습니다. 이 항목을 선택하지 않아도 계속 액세스 할 수 있습니까?


좋습니다 . msdn ( msdn.microsoft.com/en-us/library/bb628653.aspx ) 에 대한 간단한 설명이 있습니다. 그러나 누구에게 더 나은 설명이 있습니까? 이것이 내가 설정 한 DataContract를 어떻게 참조합니까?
stiank81 2009

답변:


37

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

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

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

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


2
감사! 어제 스크린 캐스트를 찾았습니다. 그것을보고, 그것은 정말로 눈을 뜨게했다! 기본을 갖추면 해당 구조로 이동할 계획입니다. 내가보고있는 것과 똑같은 문제로 어려움을 겪고 계신 것 같습니다. 나는 뭔가 이상하게 잘못되었을 때 서비스 참조를 삭제하고 읽는 것을 너무 자주 끝내는데, 그것은 좋은 징조가 아닙니다. 설명 된 아키텍처가 도움이되기를 바라는 것입니다!
stiank81 2009

Silverlight 5에서 PollingDuplex Binding을 사용할 때 웹 서비스를 직접 작성할 수있는 사람이 있습니까?
Richard B

157

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

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


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


2
VS 2012의 재시작도 필요합니다
George Filippakos 2013 년

시청하고 싶지만 링크가 끊어졌습니다. 다른 곳에있는 경우 공유하십시오
Chris

1
VS2013의 MVC 3 프로젝트에서 작동합니다 (다시 시작할 필요 없음).
Pawel Krakowiak

5
+1-참고 용 :이 변경을 수행하려면이를 사용하는 프로젝트에서 서비스 참조를 마우스 오른쪽 단추로 클릭하고 '서비스 참조 구성 ...'을 선택하십시오.
GrandMasterFlush

2
"짧은 이야기"보다 더 좋은 것은 없습니다. :)
Ron

9

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

가져올 수 없었던 내 클래스에 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
}

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


8

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


고마워! 더 이상 서비스 참조를 사용하지 않음-@Shiraz의 답변에서 스크린 캐스트에 설명 된 수동 접근 방식을 수행합니다. 그러나 이것은 어쨌든 알아서 반갑습니다!
stiank81 2010 년

8

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

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


2
참조를 삭제하지 않고 문제를 해결하기로 결정한 경우에도 새 프로젝트를 만들고 참조를 추가하여 작동하는지 확인하는 것이 좋습니다. 이것은 당신이 기존 프로젝트에 표시되지 않는 오류를 공개하거나 그냥 작동 할 수
Simon_Weaver

4

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

행운을 빕니다.


2

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


이것은 나를 도왔지만 .NET 4.5.2에서 4.6 Gaa로 변경했습니다!
Jimenemex

1

'참조 된 어셈블리에서 형식 재사용'을 해제하면 모호한 참조 문제가 발생할 수 있다는 단점이 있습니다. 이는 참조 .cs 파일에서 해당 개체를 다시 만드는 서비스 참조로 인한 것이며 서비스를 구현하는 코드가 원래 네임 스페이스에서 개체를 참조 할 수 있습니다.

이 시나리오가 발생하면 '지정된 참조 된 어셈블리의 재사용 유형'을 확인하는 것이 유용하다는 것을 알게되었습니다.이 방법을 사용하면 모호한 참조가있는 유형 만 선택할 수 있으므로 문제가 빠르게 해결됩니다.

다른 사람에게 도움이되기를 바랍니다.


0

WCF 서비스의 내 인터페이스는 어셈블리에 있고 구현은 다른 어셈블리에 있으며 서비스 참조는 서비스 참조의 클라이언트와 별도로 또 다른 어셈블리에 있습니다. 열거 형에 DataContract를 적용한 직후 오류 메시지가 나타납니다. EnumMember를 열거 형의 필드에 적용한 후 문제가 해결되었습니다.


0

서비스에 문제 (예 : 열거 형 문제 또는 다른 사람이 언급 한 직렬화 할 수없는 클래스 문제)가 없는지 의심되는 경우 새 프로젝트 를 만들어보십시오. 새 참조 .

Silverlight 5를 사용하고 있으며 참조를 여러 번 삭제하고 다시 만들려고했습니다. 그만큼reference.cs파일은 완전히 왔을 때마다 비우고 내가 서비스에 변경이 있었는지 알아 내려고 노력하는 것은 문제 외였다 있도록 만든 거라고 이후 말 그대로 년이었다.

오류에 2.0.5.0에 대한 참조가 포함되어 있음을 알았습니다. 지금은 이것이 실제로 Silverlight 버전과 관련이 있는지조차 모르겠지만, 새로운 프로젝트를 만드는 것만 생각하게했고 갑자기 모든 것이 작동했습니다.

경고 2 사용자 지정 도구 경고 : wsdl : portType 세부 정보를 가져올 수 없습니다. WSDL 가져 오기 확장 프로그램을 실행하는 동안 예외가 발생했습니다. System.ServiceModel.Description.DataContractSerializerMessageContractImporter 오류 : 파일 또는 어셈블리를로드 할 수 없습니다. 'System.Xml, 버전 = 2.0.5.0, Culture = neutral, PublicKeyToken = 7cec85d7bea7798e '또는 해당 종속성 중 하나입니다. 시스템이 지정된 파일을 찾을 수 없습니다. 오류 소스에 대한 XPath : // wsdl : definitions [@targetNamespace = ''] / wsdl : port Type [@ name = 'IShoppingCart']


0

나는 내 프로젝트를 살펴보고 있었고 이와 같은 문제가 발생했습니다. WCF와 웹 사이트에서 동일한 DLL의 다른 버전으로 밝혀졌습니다. 웹 사이트에 최신 버전의 DLL이 있고 서비스가 이전 버전의 DLL을 참조하고있었습니다. 모두 동기화되면 모두 잘 작동했습니다.


0

같은 오류가 발생했습니다. 나는 무엇이 잘못되었는지 알아 내기 위해 거의 하루 동안 고생했다. 저에게 단서는 VS가 던지는 경고였습니다. 며칠 전에 내가 추가하고 제거했던 라이브러리 인 Yahoo.Yui.Compressor.dll에 대한 매핑을 시도하고있었습니다 (사용하지 않기로 결정했기 때문에). 도서관이 없었기 때문에 충격적 이었지만 어떻게 든 그것을 참조하려고했습니다.

마지막으로이 dll을 휴지통에서 복원 한 다음 서비스 참조를 성공적으로 업데이트 할 수 있습니다.


0

미래에 여기에 계신 분들에게 동일한 오류가 발생했지만 버전 문제로 인해 두 가지 다른 방식으로 발생했습니다.

두 개의 WCF 서비스와 서비스 참조를 통해 통신하는 두 개의 클라이언트 응용 프로그램이 있습니다. 양측에서 nuget 패키지를 업데이트하고 서비스 참조를 업데이트하려고 시도했는데이 오류가 발생했습니다.

삭제해도 도움이되지 않았습니다. "어셈블리 재사용"의 선택을 취소하는 것은 재사용이 필요하기 때문에 바람직하지 않습니다. 그게 요점입니다.

결국 두 가지 문제가있었습니다.

1) 첫 번째 문제는 비주얼 스튜디오 캐싱 문제였습니다. 모든 참조를 꼼꼼하게 살펴 보았지만 문제가 발견되지 않았지만 여전히 이전 버전의 파일을 찾을 수 없다고보고했습니다. 모든 너겟 패키지를 제거하고 Visual Studio를 다시 시작한 다음 다시 설치했습니다. 서비스 참조 업데이트가 작동했습니다.

2) 두 번째 문제는 종속성 문제로 인해 발생했습니다. 나는 양쪽에서 너겟 패키지를 업데이트했고 모든 것이 올바르게 보였지만 표시되지 않은 종속성이 동기화되지 않았습니다. 예:

패키지 Foo v1은 Bar v1을 참조합니다. 참조를 업데이트하지 않고도 Foo 및 Bar를 v2로 독립적으로 업데이트 할 수 있습니다. Foo와 Bar v2를 모두 설치하면 서비스 참조 도구가 Foo v2를 스캔하고 Bar v1에 대한 참조를 확인하며 이전 버전을 찾을 수 없기 때문에 실패합니다. 모든 패키지에 대해 dll의 버전 번호를 업데이트하는 경우에만 올바르게보고됩니다. Visual Studio 및 MSBuild는 응용 프로그램을 빌드하는 데 문제가 없지만 서비스 참조는 모든 것을 해결하는 데 끔찍한 시간을 보냅니다.

누군가에게 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.