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


159

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

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

답변:


377

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

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

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


5
그것이 나에게 일어난 때 나는 또한 ObjectModel.ObservableCollection에서 Generic.List의 컬렉션 유형 변경하기 위해 필요한 것을 발견
요시 다한

2
부분 수업에 추가했기 때문에 나에게 일어났다.
Makotosan

2
그러나 특정 어셈블리의 유형을 사용하려는 경우 해당 어셈블리 만 선택할 수 있으며 (적어도 필자의 경우) ta
Dead.Rabit

26
6 년 후에도이 질문에서 일주일에 평균 50 점을 받는다는 생각이 듭니다. MS에 와서 이것을 고치십시오. 빈 파일을 쳐다 보지 말고 개발자에게 문제가 생길 경우 피드백을 제공하십시오.
Anderson Imes

1
9 년 후에도 여전히 도움이됩니다. 감사합니다!
매개 변수

38

허용되는 답변에서 알 수 있듯이 유형을 재사용 할 때 유형 참조 문제가 원인 일 수 있습니다. 문제를 쉽게 결정할 수없는 경우 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를 사용하지 않는 경우 클라이언트와 서버에서 공유 유형이 정확히 동일한 지 확인하는 것이 좋습니다. 그렇지 않으면이 문제가 발생할 수 있습니다.


필자의 경우 WCF 서비스를 참조하는 어셈블리를 참조한 후에 발생했습니다. 고정 된 형식을 공유하기 위해 어셈블리 목록에서 해당 어셈블리를 제거합니다.
xr280xr

서비스 참조를 추가 할 때 의미없는 오류 메시지 (네임 스페이스 만)가 발생하여 문제가 지적되었습니다.
bcampolo

12

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


@ svcutil.exe를 실행하는 방법? 도와주세요 ?
Arul Sidthan 12

@Arul : Google을 사용하여 svcutil.exe에 대한 정보를 찾으십시오.
John Saunders

2
Microsoft 가이 게시물을 읽었는지 확실하지 않지만 오류 및 경고 메시지 상자를 표시하지 않고 (내 경우에는 최소화 된 오류 목록) 창에 자동으로 넣는 대신 Google에 필요하지 않았습니다. 이. 또는 새로운 경고 / 오류가있을 때 탭을 빨간색 또는 노란색으로 표시하는 것이 유용 할 것 같습니다.
jrh

12

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

서비스 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 필요"가 선택되어 있는지 확인하고 클라이언트 인증서 단일 선택 단추에 "허용"이 있는지 확인하십시오. 문제가 해결되었습니다!


5

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

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

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


3

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

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

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

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


1
알았어 이전 버전을 참조하고있는 것으로 나타났습니다 System.Xml.Linq. 버전을 바꾸었다면 모든 DLL의 버전을 확인하십시오
Simon_Weaver

1

최근에 프로젝트에 컬렉션을 추가 한 경우 동일한 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> { }

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



1

내 경우에 나에게 도움이되는 기술은 아무 소용이없는 답변을 읽은 후에는 모든 계약을 주석 처리하고 더 이상 작동하지 않을 때까지 주석 처리를 해제하는 것이 이진 검색 방식이었습니다. 그것은 문제의 코드 비트를 좁 힙니다.

그런 다음 해당 코드의 문제점을 추측해야합니다.

물론 도구의 일부 오류 피드백이 도움이되었을 것입니다.

웹 서비스 계약을 작성 중입니다. 멤버가없는 자리 표시 자 열거 형이있었습니다. 괜찮아. 그러나 다른 클래스의 속성에서 사용하고 클라이언트에서 계약 dll을 재사용하면 codegen이 오류 메시지없이 폭발합니다. svcutil.exe를 실행하면 도움이되지 않습니다. 이유는 언급하지 않고 CSS 파일을 출력하지 못했습니다.


모든 운영 계약을 주석 처리하면 나에게 도움이되었습니다. 범인으로 잘못된 방법을보고있었습니다. 문제 해결에 대한 기본 접근 방식을 이용해 주셔서 감사합니다.
fizch

1

다음은 여기에 나열하고, 내가 채택한 솔루션이었습니다되지 않는다 (SvcUtils 오류 메시지가 표시하는데 유용했다.하지만, 내가 가진 오류는 wrapper type message cannot be projected as a data contract type since it has multiple namespaces. 의미, 나는이 단서를 추적하고,에 대해 배웠 wsdl.exe를 통해 게시물).

필자의 경우 wsdl [ my-asmx-service-address ]을 실행하면 문제가없는 .cs파일이 생성 되어 프로젝트에 포함시키고 서비스를 사용하도록 인스턴스화했습니다.


0

@dblood가 지적했듯이 주요 고통은 DataContractSerializer에 있으며 유형을 올바르게 재사용하지 못합니다. 여기에 이미 몇 가지 대답이 있으므로 다음과 같은 장점과 단점을 추가하여 시작하겠습니다.

  • 'IsReference'플래그는 많은 문제를 야기하지만 제거하는 것이 항상 정답은 아닙니다 (특히 : 재귀 상황).
  • 근본적인 문제는 데이터 계약이 유형 이름과 동일하지 않다는 것입니다. 때로는 이름이 다릅니다 (아, 맞습니까?). 분명히 serializer는 까다 롭고 실제 문제를 찾기가 매우 어렵습니다.
  • '서비스 참조 구성'에서 '참조 확인'을 제거하면 작동하지만 여러 가지 구현이 가능합니다. 그러나 종종 DLL에서 SOAP 인터페이스를 재사용합니다. 또한 내가 아는 가장 성숙한 SOA에서는 여러 서비스 인터페이스가 동일한 인터페이스 클래스를 구현하고 확장합니다. '참조 된 유형 사용'검사를 제거하면 더 이상 단순히 개체를 전달할 수없는 상황이 발생합니다.

다행히도 서비스를 제어 할 경우 이러한 모든 문제를 해결하는 간단한 솔루션이 있습니다. 즉, DLL 전체에서 서비스 인터페이스를 계속 재사용 할 수 있습니다. 이는 적절한 솔루션을 위해 반드시 필요한 IMO입니다. 이것이 솔루션의 작동 방식입니다.

  1. 별도의 인터페이스 DLL을 만듭니다. 해당 DLL에 모든 DataContract 및 ServiceContract를 포함하십시오. ServiceContract를 인터페이스에 배치하십시오.
  2. 인터페이스에서 서버 구현을 파생 시키십시오.
  3. 선호하는 방법으로 클라이언트를 구성하려면 동일한 DLL을 사용하십시오. 예를 들어 (IMyInterface는 서비스 계약 인터페이스입니다) :

    var httpBinding = new BasicHttpBinding();
    var identity = new DnsEndpointIdentity("");
    var address = new EndpointAddress(url, identity, new AddressHeaderCollection());
    var channel = new ChannelFactory<IMyInterface>(httpBinding, address);
    return channel.CreateChannel();

다시 말해서 : '서비스 참조 추가'기능을 사용하지 말고 WCF가 프록시 생성을 우회하여 (올바른) 서비스 유형을 사용하도록하십시오. 결국, 당신은 이미이 클래스를 가지고 있습니다.

찬성 :

  1. svcutil.exe 프로세스를 무시하므로 IsReference 문제가 없습니다.
  2. DataContract 유형과 이름은 정의에 따라 정확합니다. 결국 서버와 클라이언트 모두 동일한 정의를 사용합니다.
  3. API를 확장하거나 다른 DLL의 유형을 사용하면 (1) 및 (2)가 여전히 유지되므로 문제가 발생하지 않습니다.

단점 :

  1. 비동기 프록시를 생성하지 않기 때문에 비동기 메소드는 어려움이 있습니다. 결과적으로 Silverlight 응용 프로그램에서는이 작업을 수행하지 않는 것이 좋습니다.

0

또한 양쪽에서 프로젝트 참조 (서비스 프로젝트 및 서비스에 대한 참조가있는 프로젝트)로 작업 할 때 서비스 참조가 손상되는 문제가있었습니다. 예를 들어 참조 된 프로젝트의 .dll이 "Contoso.Development.Common"이지만 프로젝트 이름이 "공통"으로 단축 된 경우이 프로젝트에 대한 프로젝트 참조도 "공통"으로 이름이 지정됩니다. 그러나 서비스는 클래스를 해결하기 위해 "Contoso.Development.Common"에 대한 참조를 기대합니다 (서비스 참조 옵션에서이 옵션이 활성화 된 경우).

그래서 탐색기를 사용하여 서비스와 "공통"프로젝트를 참조하는 프로젝트의 폴더를 열었습니다. 거기에서 메모장으로 VS 프로젝트 파일 (.csproj)을 편집합니다. 참조 된 프로젝트의 이름 (이 예에서는 "Common.csproj")을 검색하면 프로젝트 참조를 나타내는 구성 항목을 빠르게 찾을 수 있습니다.

나는 바꿨다

<ProjectReference Include="..\Common\Common.csproj"> <Project>{C90AAD45-6857-4F83-BD1D-4772ED50D44C}</Project> <Name>Common</Name> </ProjectReference>

<ProjectReference Include="..\Common\Common.csproj"> <Project>{C90AAD45-6857-4F83-BD1D-4772ED50D44C}</Project> <Name>Contoso.Development.Common</Name> </ProjectReference>

중요한 것은 참조 이름을 참조 된 프로젝트가 출력으로 갖는 dll의 이름으로 변경하는 것입니다.

그런 다음 VS로 다시 전환하십시오. VS 외부에서 프로젝트가 수정되었으므로 프로젝트를 다시로드하라는 메시지가 표시됩니다. 새로 고침 버튼을 클릭하십시오.

그렇게 한 후 서비스 참조를 추가하고 업데이트하면 예상대로 작동합니다.

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

감사합니다


0

어제 개발하는 동안 비슷한 문제에 직면했습니다. 두 가지 버전의 계약에서 동일한 네임 스페이스를 사용하고 있음을 알았습니다.

버전 4와 버전 5의 두 가지 계약 버전이 있습니다. 버전 4에서 모든 계약을 복사하고 모든 네임 스페이스의 이름을 버전 4에서 버전 5로 변경했습니다. 이 작업을 수행하는 동안 파일 중 하나에서 네임 스페이스의 이름을 v4에서 v5로 바꾸는 것을 잊었습니다. 네임 스페이스 충돌로 인해 Reference.cs 파일이 비어있었습니다.

서비스 참조를 생성하는 동안 오류 메시지가 표시되지 않으므로이 문제를 해결하기가 어렵습니다. 이 문제를 식별하기 위해 내가 만든 모든 새 파일을 수동으로 확인합니다. 이 문제를 해결하는 다른 방법이 있습니다. 이것은 다른 옵션으로 가기 전에 수행해야 할 첫 번째 단계입니다.


0

위의 John Saunders 게시물 덕분에 오류 창을 살펴볼 아이디어가있었습니다. 나는 하루 종일 내 머리를 포기하고 있었고 출력 창에서 오류가 있는지보고있었습니다.

제 경우에는 범인이 ISerializable이었습니다. Exception 유형의 DataMember 속성을 가진 DataContract 클래스가 있습니다. ISerializable 키워드가있는 유형의 DataMember를 가질 수 없습니다. 이 예외에서 모든 것을 제거하자마자 ISerializable이되었습니다.


0

이 문제를 해결하려고 할 때 svcutil dblood의 답변에 언급 된 오류가 발생했습니다 ( "가져온 DataContract와 일치하지 않으므로 참조 된 유형을 사용할 수 없습니다").

필자의 경우 근본적인 원인은 DataContract 특성이 있지만 EnumMember 특성으로 표시되지 않은 열거 형 유형 인 것 같습니다. 문제 클래스svcutil지적한 에는 해당 열거 형 유형의 속성이 있습니다.

이것은 dblood의 답변에 대한 의견으로 더 적합하지만 그에 대한 충분한 담당자는 아닙니다 ...


0

필자의 경우 C # UserControl을 참조하는 VB Web Forms 프로젝트 솔루션이있었습니다. VB 프로젝트와 CS 프로젝트 모두 동일한 서비스에 대한 서비스 참조를 가졌습니다. 이 참조는 VB 프로젝트의 서비스 참조 및 CS (프레임 워크) 프로젝트의 연결된 서비스 그룹 아래에 나타납니다.

VB 웹 양식 프로젝트에서 서비스 참조를 업데이트하려면 (즉, Reference.vb 파일을 비워 두지 않도록) CS 프로젝트를 제거한 다음 VB 서비스 참조를 업데이트 한 다음 CS 프로젝트를 다시 추가해야합니다. 해결책.


0

다음과 같이하세요:

  1. 서비스 참조 제거
  2. Visual Studio 닫기
  3. / Bin 및 / Obj 폴더를 삭제하십시오.
  4. Visual Studio를 엽니 다.
  5. 서비스 참조를 추가하십시오.
  6. 천만에요 :)

서비스를 추가 할 때 이러한 폴더에 일부 참조가 남아 코드 자동 생성 중에 오류가 발생하는 것으로 보입니다.

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