2010-02-04 43 views
10

Es un servicio alojado de .svc IIS con ssl y membresía.wcf El servicio no se pudo activar

Mis WCF informes de clientes:

System.ServiceModel.ServiceActivationException was unhandled 
    Message="The requested service, 'https://www.greenjump.nl/WebServices/OrderService.svc' could not be activated. See the server's diagnostic trace logs for more information." 
    Source="mscorlib" 

En el servidor me sale: System.ArgumentException Esta colección ya contiene una dirección con el esquema HTTP. Puede haber como máximo una dirección por esquema en esta colección. Nombre del parámetro: elemento

Lo extraño es que esto solo ocurre en el servidor de producción, el mismo código y configuración en el servidor de desarrollo localhost funciona bien. Sólo cambio de la dirección de punto final y de nombre de equipo para www.webdomain.com

más rastreo del servidor

<ExceptionType> 
    System.ArgumentException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
</ExceptionType> 
<Message> 
    This collection already contains an address with scheme http. There can be at most one address per scheme in this collection. 
    Parameter name: item 
</Message> 
<StackTrace> 
    at System.ServiceModel.UriSchemeKeyedCollection.InsertItem(Int32 index, Uri item) 
    at System.Collections.Generic.SynchronizedCollection`1.Add(T item) 
    at System.ServiceModel.UriSchemeKeyedCollection..ctor(Uri[] addresses) 
    at System.ServiceModel.ServiceHost..ctor(Type serviceType, Uri[] baseAddresses) 
    at SharpShop.Web.StructureMap.StructureMapServiceHost..ctor(Type serviceType, Uri[] baseAddresses) 
    at SharpShop.Web.StructureMap.StructureMapServiceHostFactory.CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    at System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(String constructorString, Uri[] baseAddresses) 
    at System.ServiceModel.ServiceHostingEnvironment.HostingManager.CreateService(String normalizedVirtualPath) 
    at System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(String normalizedVirtualPath) 
    at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) 
    at System.ServiceModel.ServiceHostingEnvironment.EnsureServiceAvailableFast(String relativeVirtualPath) 
    at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.HandleRequest() 
    at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.BeginRequest() 
    at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.OnBeginRequest(Object state) 
    at System.ServiceModel.PartialTrustHelpers.PartialTrustInvoke(ContextCallback callback, Object state) 
    at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.OnBeginRequestWithFlow(Object state) 
    at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke2() 
    at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke() 
    at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.ProcessCallbacks() 
    at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.CompletionCallback(Object state) 
    at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped) 
    at System.ServiceModel.Diagnostics.Utility.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped) 
    at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) 
</StackTrace> 

config:

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="wsHttps"> 
      <readerQuotas maxStringContentLength="128000"/> 
      <security mode="TransportWithMessageCredential"> 
      <transport clientCredentialType="None"/> 
      <message clientCredentialType="UserName"/> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" > 
     <baseAddressPrefixFilters> 
     <add prefix="https://www.greenjump.nl"/> 
     </baseAddressPrefixFilters> 
    </serviceHostingEnvironment> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WsHttpWithAuthBehavior"> 
      <serviceMetadata httpsGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <serviceAuthorization principalPermissionMode="UseAspNetRoles" 
           roleProviderName="AspNetSqlRoleProvider"/> 
      <serviceCredentials> 
      <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" 
       membershipProviderName="AspNetSqlMembershipProvider" /> 
      </serviceCredentials> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="WsHttpWithAuthBehavior" name="SharpShop.Services.OrderService"> 
     <endpoint address="https://www.greenjump.nl/WebServices/OrderService.svc" 
        binding="wsHttpBinding" 
        bindingConfiguration="wsHttps" 
        contract="SharpShop.Services.IOrderService"> 
      <identity> 
      <dns value="www.greenjump.nl" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    </system.serviceModel> 
+0

podemos ver la configuración? –

+0

http://stackoverflow.com/questions/10902643/cant-activate-wcf-service/36487750#36487750 –

+0

Compartido los pasos a continuación url: http://stackoverflow.com/questions/10902643/cant-activate-wcf -service/36487750 # 36487750 –

Respuesta

1

El problema se debe al tratamiento de IIS múltiples encabezados de host. Como blowdart dijo aquí. error: esta colección ya contiene una dirección con el esquema http.

y algo más elaborado aquí http://forums.silverlight.net/forums/p/12883/274592.aspx

usando los primeros baseAddresses [0] no es una opción para mí porque mis baseAddresses eran http://localhost/WebServices/OrderService.svc http://www.greenjump.nl/WebServices/OrderService.svc https://vps2051.xlshosting.net/WebServices/OrderService.svc en este orden, por supuesto que podía hacer [1] pero no me gusta esta dependencia de configuración.

parece que mi problema es algo más compleja debido a las enlace HTTPS, este es el ServiceHostFactory me ocurrió:

public class MyServiceHostFactory : ServiceHostFactory 
    { 

     protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
     { 
      Uri webServiceAddress = baseAddresses[0]; //default to first 

      if (HttpContext.Current != null) //this only works when aspNetCompatibilityEnabled=true 
      { 
       string host = HttpContext.Current.Request.Url.Host; 
       var goodAddress = baseAddresses.FirstOrDefault(a => a.Host == host);//try to find address with same hostname as request 
       if(goodAddress!=null) 
       { 
        webServiceAddress = goodAddress; 
       } 
       Type[] sslServices = { typeof(OrderService) };//add all https services here 
       if (sslServices.Any(s => s == serviceType)) 
       { 
        UriBuilder builder = new UriBuilder(webServiceAddress); 
        builder.Scheme = "https"; 
        builder.Port = 443; //fails if you use another port 
        webServiceAddress = builder.Uri; 
       } 
      } 
      return new ServiceHost(serviceType, webServiceAddress); 
     } 
    } 

embargo esto se siente hacky, y debe ser resuelto por Microsoft.

+0

@Medo ¿Intentó agregar el puerto al punto final y el prefijo base? Esa fue una solución para que no tuviera que hacer esta fábrica personalizada. –

1

dos conjeturas: usted tiene múltiples < direcciones de punto final = "" entradas en alguna parte.

Es posible que no tengan los mismos valores, pero pueden resolverse con el mismo nombre.

O dado que parece que está utilizando https: //, ¿utiliza http en la máquina de desarrollo y https en la versión en vivo?

Si es así, ¿tiene direcciones de punto final separadas para ambos? En teoría, no debería hacer esto: habilitaría la seguridad del transporte en una dirección base http, lo que evitaría que se le pueda llamar en otra cosa que no sea https.

Técnicamente http y https son ambos esquemas http.

+0

solo un punto final, y en la máquina de dev también uso https hice una solución de búsqueda solo para estar seguro, no se encontraron otros puntos finales. Funciona en devserver Solo reemplazo el nombre de dominio y la ubicación del punto final en la producción – Medo

+0

mirando la configuración - ¿ha intentado eliminar la explícita 'dirección =' del punto final de su servicio principal? No necesita especificar una dirección base si el servicio 'comenzará' en el archivo .svc. –

0

trate de añadir un prefijo a su servidor de producción en su de web.config:

<serviceHostingEnvironment> 
    <baseAddressPrefixFilters> 
    <add prefix="https://www.greenjump.nl:443" /> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 

Esto se añadiría a <system.serviceModel>

Y el punto final debe tener este aspecto:

<endpoint address="https://www.greenjump.nl:443/WebServices/OrderService.svc" 
       binding="wsHttpBinding" 
       bindingConfiguration="wsHttps" 
       contract="SharpShop.Services.IOrderService"> 

lo contrario siempre puede sobrecargar el ServiceFactory como uno de los otros comentaristas sugeridos

8

Si aloja en IIS, no necesita la sección de dirección base, ya que es la configuración del sitio de IIS la que lo proporciona, por lo tanto, elimine esa sección.

Hay un "problema" cuando IIS está configurado para varios encabezados de host aunque, en cuyo caso es necesario utilizar una fábrica a medida que elimina todas las direcciones, aparte de la que usted desea. Un ejemplo sencillo es

namespace Example 
{ 
    public class GenericServiceHostFactory : ServiceHostFactory 
    { 
     protected override ServiceHost CreateServiceHost(Type serviceType, 
                 Uri[] baseAddresses) 
     { 
      //return the first... 
      return new ServiceHost(serviceType, baseAddresses[0]); 
     } 
    } 
} 

, entonces sería el uso que en su archivo .svc

<%@ ServiceHost 
    Service="MyImplementationClass" 
    Factory="Example.GenericServiceHostFactory" 
%> 
+0

gracias, estaba trabajando en esa dirección y publicaré mi resultado. – Medo

0

que fue capaz de resolver el problema siguiendo los pasos siguientes utilizando Visual Studio 2013:

  1. Ir a la carpeta de proyecto en el que tenga su archivo * .svc

  2. clic derecho * .svc archivo -> Ver en el navegador

  3. Validar si usted es capaz de navegar por el servicio

  4. Vaya a su proj ect carpeta donde tiene su archivo app.config o donde desea consumir el servicio.

  5. proyecto clic derecho -> Añadir -> Servicio de Referencia

  6. Haga clic en Detectar -> En Servicios Select Service -> Dar nombre deseado a su referencia de servicio -> Haga clic en OK

  7. se va a crear "ServiceReference1" en la carpeta "Referencias Servicio" & crear automáticamente/archivo app.config actualización enter image description here

Cuestiones relacionadas