locked
There can be at most one address per scheme in this collection. RRS feed

  • Question

  • When hosting my .svc in IIS, I get the following error:

    This collection already contains an address with scheme http.  There can be at most one address per scheme in this collection.

    I know this is caused by sites that have multiple bindings. In my case, I am a web hoster and have sites with multiple host headers per site.

    Is there any way to override this behavior in web.config? I've tried the following with no effect:

    <host>
      <baseAddresses>
        <clear/>
        <add baseAddress="
    http://mydomain.com" />
      </baseAddresses>
    </host>

    Any ideas for how to make this work without forcing my customers to modify their source?

    Thanks,
    Mark

    Thursday, February 8, 2007 9:45 PM

Answers

  • Hi Mark,

    Unfortunately the behavior is by design. WCF does not support multiple IIS bindings for the same protocol (here it is HTTP) for the same web site. This is for simplicity, especially it did not seem to be an important scenario. Is this a very important scenario for you? Can't you host different services in different web sites (with different ports of course)? If this does block you, we may think about revisiting this issue again.

    Thanks,

    Wenlong 

    Thursday, February 22, 2007 5:06 PM

All replies

  • Hi, Mark:

    Are you using reliable messaging?  You might be hitting this bug:

    http://blogs.msdn.com/drnick/archive/2006/12/05/incompatible-addressing-with-reliable-messaging.aspx.

    The workaround is that if you need to have multiple service endpoints that both use reliable messaging but have different message addressing versions, then you should create a new application domain to keep the endpoints separate.

    Hope this helps.

    Wednesday, February 14, 2007 4:44 AM
  • I got the same problem. Could you please tell me where shall I put the <host> section ? I tried the following, this is the only place I don't get compile error. However, the program can not recognize the second and third services.

    <system.serviceModel>
      <services>

      <service name="OpusEdge.TestModel.Service1" behaviorConfiguration="returnFaults">
        <host>
         <baseAddresses>
          <add baseAddress="http://localhost:2111/WCFService" />
         </baseAddresses>
        </host>

        <endpoint contract="OpusEdge.TestModel.IService1" binding="wsHttpBinding"/>
       </service>
       <service name="OpusEdge.TestModel.Service2" behaviorConfiguration="returnFaults">
        <endpoint contract="OpusEdge.TestModel.IService2" binding="wsHttpBinding"/>
       </service>
       <service name="OpusEdge.TestModel.Service3" behaviorConfiguration="returnFaults">
        <endpoint contract="OpusEdge.TestModel.IService3" binding="wsHttpBinding"/>
       </service>
      </services>
      <behaviors>
       <serviceBehaviors>
        <behavior name="returnFaults" >
         <serviceMetadata httpGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
       </serviceBehaviors>
      </behaviors>
     </system.serviceModel>

    Thanks,

    Bing

     

     Mark A. Richman wrote:

    When hosting my .svc in IIS, I get the following error:

    This collection already contains an address with scheme http.  There can be at most one address per scheme in this collection.

    I know this is caused by sites that have multiple bindings. In my case, I am a web hoster and have sites with multiple host headers per site.

    Is there any way to override this behavior in web.config? I've tried the following with no effect:

    <host>
      <baseAddresses>
        <clear/>
        <add baseAddress="
    http://mydomain.com" />
      </baseAddresses>
    </host>

    Any ideas for how to make this work without forcing my customers to modify their source?

    Thanks,
    Mark

    Thursday, February 22, 2007 2:36 PM
  • Hi Mark,

    Unfortunately the behavior is by design. WCF does not support multiple IIS bindings for the same protocol (here it is HTTP) for the same web site. This is for simplicity, especially it did not seem to be an important scenario. Is this a very important scenario for you? Can't you host different services in different web sites (with different ports of course)? If this does block you, we may think about revisiting this issue again.

    Thanks,

    Wenlong 

    Thursday, February 22, 2007 5:06 PM
  •  Wenlong Dong wrote:

    Hi Mark,

    Unfortunately the behavior is by design. WCF does not support multiple IIS bindings for the same protocol (here it is HTTP) for the same web site. This is for simplicity, especially it did not seem to be an important scenario. Is this a very important scenario for you? Can't you host different services in different web sites (with different ports of course)? If this does block you, we may think about revisiting this issue again.

    Thanks,

    Wenlong 

    I don't have multiple bindings but I am getting this same error. Let me explain. When I copy the assemblies and the .svc to the remote machine I get an error that Microsoft.CommerceServer.Internal.ContentListHelper.dll could not be loaded (I am developing on a 32 bit OS and copying to a 64 bit OS). Looking on the remote computer I find another assembly with the same name and replaced it. The new files size was 91KB and the old one was 71KB. I am assuming that the difference in size is because of the 64 bit OS. With the newly copied file I get the error that is described in this thread. Is this related to the 64 bit OS or is there another problem?

    Thank you.

    Kevin

    Friday, February 23, 2007 4:27 PM
  • This is quite important, since I'm a web hoster. Each of my customers' sites are provisioned with serveral ServerBindings in the metabase, not just www.domain.com. This is causing the problem, espcially for shared hosting.

    I'd like to offer my customers a simple workaround via web.config if possible. Not everyone has the skills or desire to modify their WCF service just to work around this "feature". They'll just go to another web host that doesn't allow multiple host headers. Not good for business.

    Can you offer a workaround, or point me to a KB article that I can give my customers who want to use WCF?

    Thanks,
    Mark
    Wednesday, February 28, 2007 3:15 AM
  • I also have this problem with multiple headers to a website and consider it an important feature to have this ability.
    Friday, June 8, 2007 11:23 PM
  • You might be able to work around this with a custom ServiceHostFactory, whose CreateServiceHost method looks through the Uri[] that IIS passes it, and filters out the extras so that only one Uri (the host header appropriate to the WCF service) is used.  A trivial subclass that just overrides this one method and filters the Uri[] parameter and then calls into the base class might be sufficient.

    http://msdn2.microsoft.com/en-us/library/system.servicemodel.activation.servicehostfactory.createservicehost.aspx

     

    http://msdn2.microsoft.com/en-us/library/aa702697.aspx

    Saturday, June 9, 2007 12:05 AM
  • I tried this custom ServiceHostFactory suggestion,  but then I get the error (my binding requires https):

     

    Could not find a base address that matches scheme https for the endpoint with binding BasicHttpBinding. Registered base address schemes are [http].

     

    If I try setting to the https Uri, I get an error because the MexdataExchange needs http.  How do I work round this?

     

    Thanks in advance

    Friday, November 9, 2007 6:05 PM
  • Maybe if I re-phrase this, someone might know of a solution:

     

    How can I use ServiceHostFactory in an IIS-hosted app to work with my https binding and the MexdataExchange http binding?

    It seems I can only either select the http base address or the https base address but not both.

     

    Thanks

    Monday, November 12, 2007 2:35 PM
  • This is a significant issue because in the real world, most websites have multiple host headers (for multiple domain prefixes .com .net .org as well as for www and nonwww domain names). 

     

    Anyways, I just came accross the solution for .net 3.5:  http://blogs.msdn.com/rampo/archive/2008/02/11/how-can-wcf-support-multiple-iis-binding-specified-per-site.aspx

     

    Shan

    • Proposed as answer by alexsilverrose Monday, November 30, 2009 4:39 PM
    Thursday, April 17, 2008 12:07 AM
  • This is an INCREDIBLY important scenario.  The inability for WCF to host web services on a website with multiple host headers is a major defect.  The bottom line is that as soon as a second host header is added to the website, it breaks all of the services running on the website. Please revisit WCF design.

     

    Sincerely,

    Shan McArthur

    Tuesday, May 27, 2008 3:43 AM
  • this is important for me. Seems like without a host header the WSDL is generated using the local machine name. So I need two host headers one for each of the urls that access our site.

     

    Monday, June 9, 2008 7:39 PM
  • Wenlong Dong,

     

    Please revisit this issue again.  This is a blocking issue for anyone that has existing applications, and they want to use System.ServiceModel.Activation.WebServiceHostFactory to build REST style web services that can respond over multiple hostnames in IIS.

    Wednesday, July 16, 2008 8:58 PM
  • Tuesday, September 9, 2008 11:30 AM
  • This is an extremely important issue for me.

    My application switches configurations depending on the hostname it's being accessed on.

    So, one domain will use one database, whilst another domain could switch to an entirely different database (purely as an example). I'd like my services to also follow this pattern.

    With this model, I only want to install the app once, and simply point multiple host names at it in IIS. I don't want to have to upgrade 20 different webs every time I deploy an update. I don't want to have to maintain 20 different web.configs each with their own baseAddressPrefixFilters, just because each site has both a www.mydomain.com and a mydomain.com. This design decision seems extremely restrictive and causes obvious problems in very common hosting scenarios. In my opinion it would be well worth revisiting!

    Pete
    Tuesday, September 23, 2008 8:41 PM
  • Another enthusiastic vote for multiple hostnames per scheme (http) support.

    For the use case that the service must listen on multiple host names (a typical scenerio in enterprise deployment.), the workaround that specifies multiple hostnames as absolute URIs in the config file has a serious flaw - httpGet cannot be enabled.

    The httpGetEnabled functionality in the serviceMetadata service behavior only supports relative paths that are in the IIS collection.  Basically, if this workaround is used, an absolute path must also be specified in the httpGetUrl attribute.  This service behavior does not support multiple absolute paths - it is not possible to enable httpGet for the service if the workaround is used.
    Thursday, November 13, 2008 4:36 PM
  • This may be a solution for those whose web servers have multiple host headers defined and each web servers may have a different set of host headers.

     

     

    Since WCF services hosted in IIS can have only one Base Address so we can create a custom service factory to intercept and create a System.ServiceModel.ServiceHost for a specific type of service with a dynamic URI or base address that is from the request URL.

     

     

    To do this:

     

    1) In your .svc file:

     

       Add the Factory attribute as the following:

     

       <%@ ServiceHost Language="C#"  Service="YourNameSpace.RssService" CodeBehind="~/App_Code/Service.cs" Factory="YourNameSpace.DynamicMultipleHostHeadersBinding" %>

     

     

    2) In your Service.cs file:

     

       Add the following class to your service.cs file:


    namespace YourNameSpace

       public class DynamicMultipleHostHeadersBinding : ServiceHostFactory

        {

     

            protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)

            {

                Uri[] dynamicAddress = new Uri[1];

                dynamicAddress[0] = GetDynamicURI();

                return base.CreateServiceHost(serviceType, dynamicAddress);

            }

     

            Uri GetDynamicURI()

            {

                String hostName = String.Format("{0}{1}/YourWebApplication/Service.svc", ((String.Compare(HttpContext.Current.Request.ServerVariables["HTTPS"], "on", true) == 0) ? "https://" : "http://"), HttpContext.Current.Request.ServerVariables["SERVER_NAME"].ToString());

     

                return new Uri(hostName);

            }

        }


    ....

    ....


    3) Complile and run.

     

     

    Hope this helps,

     

    Kevin Duong

    Thursday, January 8, 2009 6:37 PM
  • +1 for this being important and needing to be fixed. ASAP. This is a huge barrier for WCF.
    Tuesday, January 20, 2009 4:30 PM
  • kmd888 said:

    This may be a solution for those whose web servers have multiple host headers defined and each web servers may have a different set of host headers.

     

     

    Since WCF services hosted in IIS can have only one Base Address so we can create a custom service factory to intercept and create a System.ServiceModel.ServiceHost for a specific type of service with a dynamic URI or base address that is from the request URL.

     

     

    To do this:

     

    1) In your .svc file:

     

       Add the Factory attribute as the following:

     

       <%@ ServiceHost Language="C#"  Service="YourNameSpace.RssService" CodeBehind="~/App_Code/Service.cs" Factory="YourNameSpace.DynamicMultipleHostHeadersBinding" %>

     

     

    2) In your Service.cs file:

     

       Add the following class to your service.cs file:


    namespace YourNameSpace

       public class DynamicMultipleHostHeadersBinding : ServiceHostFactory

        {

     

            protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)

            {

                Uri[] dynamicAddress = new Uri[1];

                dynamicAddress[0] = GetDynamicURI();

                return base.CreateServiceHost(serviceType, dynamicAddress);

            }

     

            Uri GetDynamicURI()

            {

                String hostName = String.Format("{0}{1}/YourWebApplication/Service.svc", ((String.Compare(HttpContext.Current.Request.ServerVariables["HTTPS"], "on", true) == 0) ? "https://" : "http://"), HttpContext.Current.Request.ServerVariables["SERVER_NAME"].ToString());

     

                return new Uri(hostName);

            }

        }


    ....

    ....


    3) Complile and run.

     

     

    Hope this helps,

     

    Kevin Duong



    Kevin, I don't believe this solution will work. The problem is that you will get into a first one in wins scenario. So if somebody first hits the service through http then http now becomes your base address so if someone subsequently hits the site through https it won't work. And vice versa. This is the crux of the issue. You can't dynamically build your service endpoint because the first one in wins. This is really a huge issue with WCF and, IMO, should be fixed through a service pack ASAP.
    Tuesday, January 20, 2009 4:42 PM
  • I just want to add one more post about this being a real issue for hosting.  One of the bigger reasons for allowing multiple base addresses for multiple host headers is AJAX.  Some of us would like to make RESTful services for AJAX calls in our web sites.  Notice the term web site and not web application.  Sure we could put all of the services on another virtual host called services.foobar.com, but when someone tries to make an XMLHTTPRequest from a page on www.foobar.com, espanol.foobar.com, or pick any other host header that handles that content, they will get an access denied error.  So then you will have to mess with setting the domain for the document, which can bring up more issues, specifically, that you might not have full control over all hosts in the foobar.com domain.

    So not allowing WCF services to have multiple base addresses for a service means that you cannot actually use WCF to make RESTful services like these.  (Which I though was a big reason for the JSON serialization in .Net 3.5)  So hopefully someone at MS is reading this and this can be bumped up in priority to maybe make it into a service pack.  It is not like MS is worried about adding in large features or changing the behavior of old ones to sell more.  (Referring to the action attribute of a form that is runat=server to actually be used... that was a fun issue)
    Thursday, January 22, 2009 2:17 AM
  • I cant belive microsoft made this by design.  I mean every website has two hosts, mywebsite.com and www.mywebsite.com.  So obvious.
    Mike Flynn
    Friday, January 23, 2009 10:45 PM
  • I agree with all of this - we used WCF as a client server communication mechanism for an off the shelf application (driven by an architect that wants to use the "new hip tech").  In my opinon, WCF is best suited for the quick and dirty internal IT bespoke app.  Not for software developers.

    I'm seeing more and more of this from Microsoft - things like LINQ and WCF are really "cool" and the Microsoft guys can demo "I put together a whole app framework in 15 min" but jeez - it doesn't scale, it is a b^&U to configure (and keep configured in a user-run-time environment) and we spend more and more time on things breaking due to network configuration, etc.  Oversigts such as multiple http headers don't help. 

    If i'm writing glorified Hello World, WCF is cool - but in the real world, its a bust.  Little things like the size limit on Proxy generation using SVCHOST show me that microsoft didn't intend to use it in a scaled enterprise environment. 

    End rant  :)

    Saturday, January 24, 2009 8:19 PM
  • I agree too.

    Year 2009, developing with the "latest" Microsoft products and.... they do not support the most BASIC things. I mean, virtual hosting has been there years and years.

    I'm starting to believe that Microsoft has something against web applications. They plague all their products with small problems/bugs that make development more difficult and problematic.
    Friday, February 20, 2009 10:23 AM
  • hey all, i just had this experience described.

    i was getting this error in event viewer:

     

    Exception: System.ServiceModel.ServiceActivationException: The service '/TestService/Service1.svc' cannot be activated due to an exception during compilation. The exception message is: This collection already contains an address with scheme net.tcp. There can be at most one address per scheme in this collection.

    Parameter name: item. ---> System.ArgumentException: This collection already contains an address with scheme net.tcp. There can be at most one address per scheme in this collection.



    Make sure that you check the C:\windows\system32\inetsrv\config\applicationHost.config file and ensures that there is only one http binding inside the <bindings> element.

    I had this problem with net.tcp when i ran appcmd set twice on TCP.

    see i had this:
                  <bindings>
                        <binding protocol="http" bindingInformation="*:80:" />
                        <binding protocol="net.tcp" bindingInformation="808:*" />
                        <binding protocol="net.pipe" bindingInformation="*" />
                        <binding protocol="net.msmq" bindingInformation="localhost" />
                        <binding protocol="msmq.formatname" bindingInformation="localhost" />
                        <binding protocol="net.tcp" bindingInformation="4545:*" />
                    </bindings>

    and i had to manually delete the extra net.tcp to get it to work again.
    James Peckham CSM Developer and Agilist http://www.jamespeckham.com
    Thursday, June 11, 2009 2:02 AM
  • I have the same problem too.  I have a web-server with multiple headers + existing webservice.  I cannot add my new WCF service to the same website.  It has the same error "The exception message is: This collection already contains an address with scheme http.  There can be at most one address per scheme in this collection."

    This is absolutely a huge problem, for small + middle size businesses.

    DQ 
    David N.
    Sunday, July 19, 2009 4:18 AM
  • This is a significant issue because in the real world, most websites have multiple host headers (for multiple domain prefixes .com .net .org as well as for www and nonwww domain names). 

     

    Anyways, I just came accross the solution for .net 3.5:  http://blogs.msdn.com/rampo/archive/2008/02/11/how-can-wcf-support-multiple-iis-binding-specified-per-site.aspx

     

    Shan


    I know it's a year later, but the above solution (on Ram Poornalingam's blog) solved this issue for me, when I had two web-applications hosted on a shared-hosting provider, where the default website had one WCF service defined (using http) and the site in a subdomain (created as a seperate website in IIS, but at wcf.mydomain.com instead of www.mydomain.com) had a separate WCF service (also using http) defined.

    So if any other web-developers run into this issue, using the <baseAddressPrefixFilters> element (and simply adding the subdomain, without any port number, as a prefix) worked. Thanks Shan!

    Technology Applied
    Thursday, July 23, 2009 8:39 AM
  • Couldn't agree more. This is really a severe issue!
    Wednesday, September 16, 2009 4:09 AM
  • I found a nice alternative here:
    http://www.webhost4life.com/HostingKB/KnowledgebaseArticle50088.aspx

    <servicehostingenvironment>
    <baseaddressprefixfilters>
    <add prefix="http://www.example.com">
    </add>
    </baseaddressprefixfilters>

    </servicehostingenvironment></system.servicemodel>

    Thursday, October 8, 2009 1:19 PM
  • Thanks for this post, it solved our problem. After reading so many similar solutions and none working this was a great and simple fix. In our case it was the addition of a secure URL that resulted in the second binding entry, the first should have been removed when the default https binding was removed but it was not.
    Monday, November 16, 2009 8:53 PM
  • I found a nice alternative here:
    http://www.webhost4life.com/HostingKB/KnowledgebaseArticle50088.aspx

    <servicehostingenvironment>
    <baseaddressprefixfilters>
    <add prefix="http://www.example.com ">
    </add>
    </baseaddressprefixfilters>

    </servicehostingenvironment></system.servicemodel>

     

    This looked very promising however I am having trouble applying the solution. I have IIS7.5 2008 RC2 .net 3.5 Web application server. Only just found this issue as I am migrating between lab domains however I need both working at the same time. I figured it was no different to a hosted solution with multiple domains but I think I am missing something.

    In IIS I have two host headers applied

    server.labdomain.com 80           *

    server.lab.domain.com 80           *

    If I remove one of the headers from IIS all works fine but is undesirable.

    If I try the following config as described in the article it just ignores it with the same "This collection already contains an address with scheme http" error message.

     

     

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true">
    	<baseAddressPrefixFilters>
    		<add prefix="http://server.labdomain.com"/>  
    	</baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    
    <service behaviorConfiguration="MyApplication.WebServices.MyBehavior"
    	name="MyApplication.WebServices.MyService">
    	<endpoint address="http://server.lab.domain.com/myapplication/webservices/myservice.svc/basic" 
    		binding="basicHttpBinding" contract="MyApplication.WebServices.IMyService">
    		<identity>
    			<dns value="localhost" />
    		</identity>
    	</endpoint>
    	<endpoint address="http://server.lab.domain.com/myapplication/webservices/public.svc/mex" 
    		binding="mexHttpBinding" contract="IMetadataExchange" />
    	<endpoint address="http://server.lab.domain.com/myapplication/webservices/public.svc/ws" 
    		binding="wsHttpBinding" contract="MyApplication.WebServices.IMyService">
    		<identity>
    			<dns value="localhost" />
    		</identity>
    	</endpoint>
    </service>
    

     

    Some advice would be appreciated.

     

     

    Wednesday, July 7, 2010 12:41 PM
  • No kidding. At 1:30 am I couldn't believe my Ajax wasn't working. All sites have a minimum of 2 headers.

     

    The designer must have split coffee on himself when they discussed this.

    Friday, August 12, 2011 2:44 PM
  • Thank you!  This worked for me.  All that I had to do was update my web.config file with the <baseAddressPrefixFilters> tags and everything worked great.  The rest of this mess was generated by VS2008 when I created this WCF Service.  I also added a crossdomain.xml and clientaccesspolicy.xml files to my website and the add service reference silverlight project menu item pulled in the service reference and generated the proxy perfectly.  I had three web sites on the same computer.  Thanks again.

     

    <

    bindings

    >

    <

    customBinding

    >

    <

    binding name="customBinding0"

    >

    <

    binaryMessageEncoding

    />

    <

    httpTransport

    />

    </

    binding

    >

    </

    customBinding

    >

    </

    bindings

    >

    <

    serviceHostingEnvironment aspNetCompatibilityEnabled="true"

    >

    <

    baseAddressPrefixFilters

    >

    <

    add prefix="http://www.grovesrobotics.com"

    />

    </

    baseAddressPrefixFilters

    >

     

    </

    serviceHostingEnvironment

    >

     

     

    <

    services

    >

    <

    service behaviorConfiguration="SA.Web.SAWCFBehavior" name="SA.Web.SAWCF"

    >

    <

    endpoint address="" binding="customBinding" bindingConfiguration="customBinding0"

     

    contract="SA.Web.SAWCF"

    />

    <

    endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"

    />

    </

    service

    >

    </

    services

    >

    Wednesday, August 17, 2011 10:57 PM
  • This worked for me perfectly.  Added to the WebConfig in the System.ServiceModel section.  I placed it after the bindings section and before the services section, as shown below:

        </bindings>
        <serviceHostingEnvironment>
          <baseAddressPrefixFilters>
            <add prefix="http://edidev.btol.com"/>
          </baseAddressPrefixFilters>
        </serviceHostingEnvironment>
        <services>


    mp

    Friday, April 26, 2013 3:14 PM
  • I confirmed this as the appropriate solution.
    Wednesday, August 21, 2013 4:02 PM