WCF 서비스 시작 오류 "이 모음에는 이미 체계가 http 인 주소가 포함되어 있습니다."


182

WCF 서비스 계약과 해당 WCF 서비스를 호출하는 Silverlight 컨트롤이 포함 된 웹 응용 프로그램을 구축했습니다. 내 개발 및 테스트 서버에서 훌륭하게 작동합니다.

라이브 서버에 배포하고 응용 프로그램을 실행하면 System.ServiceModel.ServiceActivationException컴파일 중에 예외로 인해 서비스를 활성화 할 수 없다는 유형 의 예외가 발생합니다. 예외는 다음과 같습니다.

이 모음에는 이미 체계가 http 인 주소가 있습니다. 이 컬렉션에는 구성표 당 최대 하나의 주소가있을 수 있습니다.

웹 사이트에 둘 이상의 호스트 헤더가있는 경우이 예외가 발생할 수 있음을 읽었으며 라이브 서버에서 마찬가지입니다. IIS에서 호스팅되는 WCF 서비스는 기본 주소를 하나만 가질 수 있습니다. 이 문제를 어떻게 해결할 수 있습니까?

답변:


167

.Net 4에서는 다음 multipleSiteBindingsEnabled옵션을 사용할 수 있습니다 .

<system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
    </serviceHostingEnvironment>
</system.serviceModel>

그런 다음 각 주소를 지정할 필요가 없습니다.

http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehostingenvironment.multiplesitebindingsenabled.aspx


예. 그러나 이것은 .NET 4.0 이상에서만 작동합니다. .NET 2.0 / 3.0 / 3.5 사이트에서는이를 사용할 수 없습니다.
Bytemaster

2
참고-여기에 오타가 있습니다. 닫기가 없습니다.> 복사하여 붙여 넣으면 문제가 발생합니다
sydneyos

2
이 질문에서는 작동하지 않습니다. "이 기능은 HTTP 프로토콜을 통해서만 사용할 수 있습니다."
George Tsiokos

146

요약,

코드 솔루션 : 여기

구성 솔루션 : 여기

Mike Chaliy 의 도움으로 코드를 통해이를 수행하는 방법에 대한 솔루션을 찾았습니다. 이 문제는 실제 환경에 배포하는 거의 모든 프로젝트에 영향을 미치기 때문에 순수하게 구성 솔루션을 원했습니다. 결국 .net 3.0 및 .net 3.5에서 수행하는 방법을 자세히 설명하는 것을 발견했습니다.

다음은 사이트에서 가져온 응용 프로그램 웹 구성을 변경하는 방법의 예입니다.

<system.serviceModel>
    <serviceHostingEnvironment>
        <baseAddressPrefixFilters>
            <add prefix="net.tcp://payroll.myorg.com:8000"/>
            <add prefix="http://shipping.myorg.com:9000"/>
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
</system.serviceModel>

위의 예에서 net.tcp : //payroll.myorg.com : 8000 및 http://shipping.myorg.com:9000 은 각 스킴에 대한 유일한 기본 주소이며, 전달 될 수 있습니다. baseAddressPrefixFilter는 와일드 카드를 지원하지 않습니다.

IIS에서 제공하는 baseAddress는 baseAddressPrefixFilter 목록에없는 다른 체계에 바인딩 된 주소를 가질 수 있습니다. 이 주소는 필터링되지 않습니다.

Dns 솔루션 (예상치 않음) : 웹 응용 프로그램과 관련된 새로운 dns 항목을 만들고 새 웹 사이트를 추가하고 dns 항목과 일치하는 단일 호스트 헤더를 제공하면이 문제를 완전히 완화 할 수 있다고 생각합니다. 사용자 정의 코드를 작성하거나 web.config 파일에 접두사를 추가해야합니다.


2
기본 주소 접두사 필터를 web.config에 추가하면 완벽하게 작동했습니다. 고마워 제레미!
Mike737

2
나는 그러한 제한을 원하는 이유를 생각할 수 없다. 기본 설정보다 훨씬 적다.
pbz

42
JavaScript를 통해 액세스하는 ASP.net 및 웹 서비스와 함께 WCF에 대해 잘못 생각하기 시작했습니다. 평범한 ASMX 서비스와 관련하여 문제가 훨씬 적었습니다 ...
Juri

.net 4 및 .net 2 응용 프로그램이 혼합되어있는 사이트가 있다면 어떻게해야합니까? 응용 프로그램의 기본은 .net4이며 그 아래에 .net2가 필요한 여러 응용 프로그램이 있습니다. 모든 .net4 파일에서 <serviceHostingEnvironment multipleSiteBindingsEnabled = "true">를 사용하고 .net 2 애플리케이션의 접 두부를 사용합니까?
트래비스

59

이걸 보셨습니까 -http : //kb.discountasp.net/KB/a799/error-accessing-wcf-service-this-collection-already.aspx

web.config 파일을 변경하여이 오류를 해결할 수 있습니다.

ASP.NET 4.0을 사용하여 web.config에 다음 줄을 추가하십시오.

<system.serviceModel> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

ASP.NET 2.0 / 3.0 / 3.5를 사용하여 web.config에 다음 줄을 추가하십시오.

<system.serviceModel> 
     <serviceHostingEnvironment> 
          <baseAddressPrefixFilters> 
               <add prefix="http://www.YourHostedDomainName.com"/> 
          </baseAddressPrefixFilters> 
     </serviceHostingEnvironment> 
</system.serviceModel> 

감사. 코드 솔루션이 없는지 계속 검색하겠습니다. 구성에서 수행 할 수있는 작업은 프로젝트에 영향을 미치므로 사용자 지정 코드를 작성할 필요가 없습니다.
제레미

16

필자의 경우이 문제의 근본 원인은 부모 웹 사이트 (예 : InetMgr-> 사이트-> 내 사이트-> 속성-> 편집 바인딩)에 정의 된 여러 http 바인딩이었습니다. 필요하지 않은 하나의 http 바인딩을 삭제하고 문제가 해결되었습니다.


1
예 Amar 이것은 매우 도움이되었습니다. 제 경우에는 여러 개의 바인딩을 가진 또 다른 웹 사이트 였습니다 . 동일한 시스템에서 외부 적으로 사용 가능하지만 다른 호스트 이름으로 사용 가능합니다. 마찬가지로 multipleSiteBindingsEnabled 설정을 추가하여 수정 할 수 있지만 web.config는 다른 모든 환경과 다릅니다.
코더

2
이것이 바닥에 있다는 것은 부끄러운 일입니다. 우리의 경우에 이것은 우리를 위해 그것을 고쳤다.
브렌 돈 파커

개발 환경에서 오류를 복제하는 데 도움이되었습니다. 인증이나 라이브 환경에서 웹 사이트 바인딩을 편집 할 수 없습니다. 호스트 파일을 변경하여 도메인을 시뮬레이트하고 로컬 IIS 및 bam에 바인딩을 추가했습니다!
MFedatto

8

그리고 제 경우에는 간단했습니다 .Visual Studio에서 'Add WCF Service'마법사를 사용하여 app.config에 해당 섹션을 자동으로 만들었습니다. 그런 다음 방법 : 관리되는 응용 프로그램에서 WCF 서비스 호스팅 을 읽었습니다 . 문제는 웹 서비스를 실행하기 위해 URL을 지정할 필요가 없었습니다.

바꾸다:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))

와:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService))

그리고 오류는 사라졌습니다.

일반적인 아이디어 : 기본 주소를 매개 변수로 제공하는 경우 설정에서이를 지정,이 오류가 발생합니다. 아마도 이것이 오류를 얻는 유일한 방법은 아닙니다.


내 문제를 해결했다.
QShengyao

2

나는이 문제가 있었고 원인은 다소 어리 석었다. 커맨드 라인 실행 파일에서 ServiceHost를 실행하는 것과 관련하여 Microsoft의 데모를 시도했습니다. 적절한 서비스 (및 인터페이스)를 추가하라는 내용을 포함하여 지침을 따랐습니다. 그러나 위의 오류가 발생했습니다.

서비스 클래스를 추가하면 VS가 자동으로 구성을 app.config에 추가했습니다. 그리고 데모는 그 정보도 추가하려고했습니다. 이미 구성에 있었으므로 데모 부분을 제거하고 작동했습니다.


0

이전 2010 Exchange Server에서 동일한 오류가 발생했습니다. 서비스 (Exchange 사서함 복제 서비스)에서 위의 오류가 발생하여 마이그레이션 프로세스를 계속할 수 없습니다. 인터넷을 통해 검색 하면 아래 링크 가 나타납니다.

Exchange GRE를 처음 설치할 때 또는 IIS 서버를 변경 한 경우 열지 못합니다. 스냅인 오류와 함께 실패하고 스냅인 페이지를 열려고하면 다음 내용이 표시됩니다.

This collection already contains an address with scheme http.  There can be at most one address per scheme in this collection. If your service is being hosted in IIS you can fix the problem by setting 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' to true or specifying 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'."

원인 :이 오류는 http 포트 번호 443이 다른 응용 프로그램에서 이미 사용 중이고 IIS 서버가 동일한 포트에 대한 다중 바인딩을 처리하도록 구성되어 있지 않기 때문에 발생합니다.

해결책 : 여러 포트 바인딩을 처리하도록 IIS 서버를 구성하십시오. 공급 업체 (Microsoft)에 문의하여 구성하십시오.

이러한 서비스는 IIS 웹 서버에서 제공되었으므로 루트 사이트의 바인딩을 확인하면 문제가 해결되었습니다. 누군가가 사이트 바인딩을 엉망으로 만들어 자신과 겹치는 규칙을 정의하고 서비스를 엉망으로 만들었습니다.

올바른 바인딩을 수정하면 문제가 해결되었으며 Web.Config를 구성 할 필요가 없었습니다.

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