[C#] 때때로 WCF 서비스 참조를 추가하면 빈 참조가 생성됩니다.

때때로 WCF 서비스 참조를 추가하면 빈 reference.cs가 생성되고 프로젝트의 어느 곳에서나 서비스를 참조 할 수 없습니다.

누구든지 이것을 만난 적이 있습니까?



답변

일반적으로 코드 생성 문제이며 대부분 해결할 수없는 유형 이름 충돌이 있기 때문에 발생합니다.

서비스 참조를 마우스 오른쪽 단추로 클릭하고 구성을 클릭하고 “참조 된 어셈블리의 유형 재사용”을 선택 취소 하면 문제가 해결 될 수 있습니다.

이 기능의 일부 측면을 사용중인 경우 이름을 정리해야합니다.


답변

허용되는 답변에서 알 수 있듯이 유형을 재사용 할 때 유형 참조 문제가 원인 일 수 있습니다. 문제를 쉽게 결정할 수없는 경우 svcutil.exe 명령 줄을 사용하면 기본 문제를 밝히는 데 도움이됩니다 (John Saunders가 지적한 것처럼).

다음은 svcutil을 사용하는 간단한 예입니다.

svcutil /t:code https://secure.myserver.com/services/MyService.svc /d:test /r:"C:\MyCode\MyAssembly\bin\debug\MyAssembly.dll"

어디:

  • / t : code는 주어진 URL에서 코드를 생성합니다
  • / d : 출력 디렉토리를 지정합니다
  • / r : 참조 어셈블리를 지정합니다

전체 svcutil 명령 줄 참조 : http://msdn.microsoft.com/en-us/library/aa347733.aspx

svcutil을 실행하면 가져 오기에서 예외가 발생하는 것을 볼 수 있습니다. 유형 중 하나에 대해 다음 유형의 메시지가 표시 될 수 있습니다. “참조 된 유형은 가져온 DataContract와 일치하지 않으므로 사용할 수 없습니다.”

이는 참조 된 어셈블리의 유형 중 하나에 서비스의 DataContract에서 생성 된 유형과 차이가 있다는 점에서 명시 적으로 지정할 수 있습니다. 필자의 경우 가져오고 있던 서비스에 공유 어셈블리에 있던 것보다 최신의 업데이트 된 유형이있었습니다. 예외에서 언급 된 유형이 동일 해 보였기 때문에 쉽게 알 수 없었습니다. 다른 점은 유형에 사용되는 중첩 복합 유형 중 하나였습니다.

이러한 유형의 예외가 발생하여 결과적으로 빈 참조가 발생하는 다른 복잡한 시나리오가 있습니다. 여기에 하나의 예가 있습니다.

이 문제가 발생하고 데이터 계약에서 일반 유형을 사용하지 않거나 IsReference = true를 사용하지 않는 경우 클라이언트와 서버에서 공유 유형이 정확히 동일한 지 확인하는 것이 좋습니다. 그렇지 않으면이 문제가 발생할 수 있습니다.


답변

이 경우 오류 창과 출력 창에서 오류 메시지가 있는지 확인하십시오. 그래도 문제가 해결되지 않으면 svcutil.exe수동으로 실행 해보고 오류 메시지가 있는지 확인하십시오.


답변

나는이 정확한 문제로 하루 종일 내 머리를 강타했다. 방금 수정했습니다. 방법은 다음과 같습니다.

서비스 SSL을 통해 실행되어야했습니다 (예 : https://mydomain.com/MyService.svc에 있음 )

개발 서버에서 WCF 서비스에 대한 서비스 참조를 추가하면 정상적으로 작동합니다.

라이브 프로덕션 서버에 정확히 동일한 WCF 서비스 빌드를 배포 한 다음 클라이언트 응용 프로그램으로 전환하고 라이브 서비스를 가리 키도록 서비스 참조를 구성하면 오류가 표시되지 않지만 앱은 빌드되지 않습니다. Reference.cs 파일이 완전히 비었습니다! 서비스 참조를 업데이트해도 아무런 차이가 없었습니다. 솔루션을 청소해도 도움이되지 않았습니다. VS2010을 다시 시작해도 아무런 차이가 없습니다. 새로운 빈 솔루션을 만들고 콘솔 프로젝트를 시작하고 라이브 서비스에 서비스 참조를 추가하면 정확히 같은 문제가 발생했습니다.

충돌하는 유형이나 다른 것이 원인이라고 생각하지 않았지만 “참조 된 모든 어셈블리에서 유형 재사용”을 선택 취소하여 WCF 서비스 참조를 재구성했습니다. 기쁨이 없다. 확인 표시를 다시 넣습니다.

다음 단계는 참조 URL에서 svcutil 을 시도 하여 문제를 발견하는 데 도움이되는지 확인하는 것입니다. 명령은 다음과 같습니다.

svcutil /t:code https://mydomain.com/MyService.svc /d:D:\test

이것은 다음을 생성했습니다.

Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 4.0.30319.1]
Copyright (c) Microsoft Corporation.  All rights reserved.

Attempting to download metadata from 'https://mydomain.com/MyService.svc' using WS-Metadata Exchange or DISCO.
Error: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: Schema with target namespace 'http://mynamespace.com//' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://mynamespace.com//']/wsdl:portType[@name='IMyService']


Error: 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://mynamespace.com//']/wsdl:portType[@name='IMyService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_IMyService']


Error: Cannot import wsdl:port
Detail: There was an error importing a wsdl:binding that the wsdl:port is dependent on.
XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_IMyService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:service[@name='MyService']/wsdl:port[@name='WSHttpBinding_IMyService']


Generating files...
Warning: No code was generated.
If you were trying to generate a client, this could be because the metadata documents did not contain any valid contracts or services
or because all contracts/services were discovered to exist in /reference assemblies. Verify that you passed all the metadata documents to the tool.

Warning: If you would like to generate data contracts from schemas make sure to use the /dataContractOnly option.

그것은 완전히 저주 받았다. 심한 인터넷 검색과 교차로에 가까워지고 버스 운전사로서의 경력을 다시 생각하기는했지만 마침내 개발 박스에서 제대로 작동하는 이유를 고려했습니다. IIS 구성 문제 일 수 있습니까?

나는 개발 박스와 라이브 박스에 동시에 원격 접속했고, 각각 IIS 관리자 (IIS 7.5 실행)를 시작했다. 다음으로 각 상자의 각 구성 설정을 살펴보고 각 서버의 값을 비교했습니다.

문제가 있습니다. 사이트의 “SSL 설정”에서 “SSL 필요”가 선택되어 있는지 확인하고 클라이언트 인증서 단일 선택 단추에 “허용”이 있는지 확인하십시오. 문제가 해결되었습니다!


답변

참조를 추가하고 제거한 다음 동일한 이름의 서비스를 다시 추가 할 때마다 이것이 일반적으로 발생한다는 것을 알았습니다. 형식 충돌은 Visual Studio에서 볼 수있는 어딘가에 남아있는 오래된 파일로 인해 발생하는 것으로 보입니다. 새로운 참조를 추가하기 전에 수정하기 위해해야 ​​할 일은 깨끗합니다.

  1. 문제가있는 서비스 참조를 제거하십시오.
  2. 솔루션 탐색기 에서 프로젝트 이름을 클릭하여 프로젝트 를 강조 표시하십시오.
  3. 프로젝트 참조를 마우스 오른쪽 버튼으로 클릭하십시오.
  4. 컨텍스트 목록의 상단 근처에서 정리 항목을 클릭하십시오 .
  5. 평소와 같이 서비스 참조를 추가하십시오.

도움이 되었기를 바랍니다.


답변

이전 버전에서 업그레이드 한 Silverlight 5에서이 문제가 발생했습니다.

서비스 참조를 다시 추가해도 빈 Reference.cs가 나옵니다.

결국 새 프로젝트를 만들고 서비스 참조를 다시 만들어야했습니다. 이 작업에 약 30 분 이상을 소비 한 경우 시도해야합니다. 원래 프로젝트를 수정하기로 결정한 경우에도 발생하는 상황을 확인한 다음 거꾸로 작업하여 문제를 해결하려고 할 수 있습니다.

나는 문제가 무엇인지 정확히 알지 못했지만 .csproj 파일의 무언가가 업그레이드되지 않았거나 일부 설정이 잘못되었을 수 있습니다.


답변

최근에 프로젝트에 컬렉션을 추가 한 경우 동일한 CollectionDataContract 속성 을 가진 두 개의 컬렉션으로 인해 문제가 발생할 수 있습니다 .

[CollectionDataContract(Name="AItems", ItemName="A")]
public class CollectionA : List<A> { }

[CollectionDataContract(Name="AItems", ItemName="A")]  // Wrong
public class CollectionB : List<B> { }

프로젝트를 정리 하고 모든 NameItemName 속성이 고유한지 확인하여 오류를 수정했습니다 .

[CollectionDataContract(Name="AItems", ItemName="A")]
public class CollectionA : List<A> { }

[CollectionDataContract(Name="BItems", ItemName="B")]  // Corrected
public class CollectionB : List<B> { }

그런 다음 서비스 참조를 새로 고치고 모든 것이 다시 작동했습니다.