2009-03-27 21 views
50

The contract name 'IMyService' could not be found in the list of contracts implemented by the service 'MyService'.. ---> System.InvalidOperationException: The contract name 'IMyService' could not be found in the list of contracts implemented by the service 'MyService'.WCF Nombre del contrato 'IMyService' no se pudo encontrar?

Esto me está volviendo loco. Tengo un servicio web WCF que funciona en mi máquina de desarrollo, pero cuando lo copio en una Máquina Virtual que estoy usando para probarlo, aparece el error que parece indicar que no estoy implementando la interfaz, pero no hace sentido porque el servicio funciona en mi windows xp IIS. la máquina virtual usa Windows Server 2003 IIS. ¿Algunas ideas?

Una cosa a tener en cuenta aquí es que obtengo este error en mi VM incluso cuando trato de acceder al servicio en un navegador web como cliente.

Nota: Estoy utilizando principalPermissionMode = "UseWindowsGroups", pero eso no es un problema en mi máquina local. Simplemente me agrego al grupo de ventanas apropiado. Pero no tuve suerte en mi VM.

Config:

<configuration> 
    <system.serviceModel> 
     <diagnostics> 
      <messageLogging logEntireMessage="false" maxSizeOfMessageToLog="2147483647" /> 
     </diagnostics> 
     <services> 
      <service behaviorConfiguration="MyServiceBehaviors" name="MyService"> 
       <endpoint binding="basicHttpBinding" bindingConfiguration="basicHttpBinding" 
        name="MyService" bindingName="basicHttpBinding" bindingNamespace="http://my.test.com" 
        contract="IMyService"> 
       </endpoint> 
      </service> 
     </services> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="basicHttpBinding" maxReceivedMessageSize="2147483647"> 
        <readerQuotas maxStringContentLength="2147483647" /> 
        <security mode="TransportCredentialOnly"> 
         <transport clientCredentialType="Windows" proxyCredentialType="None" /> 
        </security> 
       </binding> 
      </basicHttpBinding> 
      <netTcpBinding> 
       <binding name="WindowsClientOverTcp" maxReceivedMessageSize="2147483647"> 
        <readerQuotas maxStringContentLength="2147483647" /> 
       </binding> 
      </netTcpBinding> 
      <wsHttpBinding> 
       <binding name="wsHttpBinding" maxReceivedMessageSize="2147483647"> 
        <readerQuotas maxDepth="32" maxStringContentLength="2147483647" 
         maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       </binding> 
      </wsHttpBinding> 
     </bindings> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="MyServiceBehaviors"> 
        <serviceMetadata httpGetEnabled="true" /> 
        <serviceAuthorization principalPermissionMode="UseWindowsGroups" 
         impersonateCallerForAllOperations="false" /> 
        <serviceCredentials /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 
</configuration> 
+0

¿El ensamblaje con la interfaz es visible para la aplicación? Además, ¿especificó el espacio de nombres como parte del nombre de la interfaz en el archivo de configuración? – casperOne

Respuesta

0

¿Tiene ningún tipo de autenticación configurado en su máquina virtual en IIS? Intenta configurarlo en anónimo y ver si se ejecuta.

+0

Intenté anónimo y reinicié iis. Todavía el mismo error. thx – M3NTA7

+0

¿Puedes publicar tu sección de configuración system.serviceModel? – bendewey

+0

He agregado el system.serviceModel a mi publicación anterior. Por favor echa un vistazo. – M3NTA7

0

Ok, esto realmente no satisface mi pregunta, pero una manera que encontré para resolverlo fue instalar .NET 3.5. porque mis otros dos entornos tenían 3.0.

Así que realmente no he determinado por qué funcionaría en un entorno y no en el otro, especialmente con ese error de interfaz.

¿Ir figura?

1

¿Puedes publicar el código de tu interfaz ...? como normalmente ocurre si no ha especificado el atributo ServiceContract en su Interfaz ...

8

¿No es necesario que el atributo de contrato en el punto extremo sea el espacio de nombre completo?

+1

Esta fue la solución a mi problema también. Lo que era confuso fue que muchos ejemplos en línea no incluían el espacio de nombres. – angularsen

+0

Esta fue la solución para mi problema también. – yonexbat

6

sí @Garry tienes razón. contrato en el punto final debe ser nombre completo

<endpoint binding="basicHttpBinding" bindingConfiguration="basicHttpBinding"  name="MyService" bindingName="basicHttpBinding" bindingNamespace="http://my.test.com" contract="Namespace.IMyService"> 
32

@Garry (un poco tarde, lo sé)

Si el atributo ServiceContract define un ConfigurationName, este debe ser el valor en el punto final, no al completo nombre calificado. Acabo de tener este problema ahora como lo describe el OP, y esta fue la solución para mí. Espero que esto ayude a alguien más que tropieza con esto.

+2

Esta respuesta me ayudó a resolver mi problema. El 'ServiceContractAttribute' en la interfaz del contrato tenía valores definidos para' Name', 'Namespace' y' ConfigurationName'. Cambié 'name',' bindingNamespace' y 'contract' en el elemento' endpoint' en el web.config del servicio de implementación para que coincida y el problema fue resuelto. – GiddyUpHorsey

+0

gracias por esto, estaba golpeando mi cabeza contra una pared de ladrillo durante media hora hasta que encontré esto. – bplus

+0

renombró un enlace de configuración pero ConfigurationName en el atributo ServiceContract y tuvo este problema ... la solución fue solucionar el conflicto de nombres, ¡hurra! – Erikest

101

[ServiceContract] falta en mi caso.

+0

en mi caso también :) –

+0

Esto también me pasó a mí. Pasé unos minutos revisando app.config porque el error no era muy claro: \. – Megacan

+6

ARGH !!!! Maldito sea todo, ¡me atrapa todo este maldito tiempo! Gracias :-) – Stimul8d

13

Ésta es una solución un poco más raro, que se aplica a mi situación con el mismo error:

Es posible que el espacio de nombres contrato puede ser anulado, con el siguiente atributo:

[System.ServiceModel.ServiceContractAttribute([...], ConfigurationName = "IServiceSoap")] 
public interface ISomeOtherServiceName 

lo cual requieren:

<endpoint address="" binding="basicHttpBinding" contract="IServiceSoap" /> 

En lugar de la habitual (espacio de nombres) .ISomeOtherServiceName.

Esto puede ser el resultado de la generación de código, en mi caso WSCFBlue

+1

este fue mi caso la configuración creó un lío para resolver después de 2 horas –

1

que tenía el mismo error, pero el origen del problema era diferente. Estaba aprendiendo sobre la marcha y primero creé un servicio utilizando el servicio WCF habilitado para Silverlight desde las plantillas de Silverlight en Visual Studio. Llamé a este TerritoryService. Cuando se crea un servicio de esta manera el web.config se altera la siguiente manera:

<services> 
     <service name="Services.TerritoryService"> 
     <endpoint address="" binding="customBinding" bindingConfiguration="Services.TerritoryService.customBinding0" 
      contract="Services.TerritoryService" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 

Los ejemplos que Im que trabajan fuera sin embargo utilizar DomainServices.i.e. cuando los usa hereda de DomainService. Así que eliminé el TerritoryService que había creado y luego creé una clase DomainService de la plantilla fuera del menú de plantillas web en Visual Studio. Seguí trabajando y todo compiló muy bien. Pero cuando lo ejecuté recibí un error según el título de esta pregunta.

El problema es que cuando se hereda de un servicio de dominio no se crea dicha entrada en el archivo web.config. No lo necesita Pero cuando elimina un servicio creado a través del servicio web habilitado para Silverlight, NO elimina la entrada en el archivo web.config.

Así que porque había nombrado ambos servicios como TerritoryService cuando se llamaba el servicio, la entrada en el web.config entraba en juego y el servidor buscaba un servicio definido de esa manera que no podía encontrar porque tenía lo borró

Así que la solución fue simplemente eliminar los talones de entrada que se habían creado automáticamente por Visual Studio en el archivo de configuración pero que Visual Studio no eliminó automáticamente cuando eliminé el servicio. Una vez que hice eso, el problema se resolvió.

Me tomó una media hora resolver esto debido a la denominación de "conflicto". Se "veía" muy bien y estaba en línea con muchos ejemplos. Por lo tanto, si está heredando de una clase de servicio de dominio, no necesita/no debe tener una entrada en el archivo de configuración como lo hace cuando creó un servicio wcf.

+0

Este me llevó a el camino correcto. Recibí este error después de: 1) Creé un servicio WCF normal (que actualizó mi web.config). 2) Luego eliminé ese servicio. 3) Luego creé un Servicio de Datos WCF con el mismo nombre. Eliminar el cambio de web.config me solucionó. –

0

Hay 2 errores en mi caso:

  1. La configuración de las secciones se copian de otro proyecto de proxy, y se olvidó de cambiar el espacio de nombres de ruta completa.

  2. Como cliente, copié la sección de punto final en el nodo de servicios; el cliente también es un servicio de wcf.

3

Tengo un hábito de hacer esto ...

<system.serviceModel> 
    <services> 
     <service name="Service" behaviorConfiguration="wsHttpBehaviour"> 
     <endpoint 
      binding="wsHttpBinding" 
      contract="IService" 
      bindingConfiguration="wsHttpBinding" 
      /> 
     <endpoint contract="IService" binding="mexHttpBinding" address="mex" /> 
     </service> 

cuando yo haga esto ...

<system.serviceModel> 
    <services> 
     <service name="namespace.Service" behaviorConfiguration="wsHttpBehaviour"> 
     <endpoint 
      binding="wsHttpBinding" 
      contract="namespace.IService" 
      bindingConfiguration="wsHttpBinding" 
      /> 
     <endpoint contract="namespace.IService" binding="mexHttpBinding" address="mex" /> 
     </service> 

lo que quiero decir ... Es el más tonto Lo que nunca (especialmente cuando la aplicación solo tiene 1 o 2 artículos) pero un nombre de clase "totalmente calificado" parece marcar la diferencia.

8

Su atributo de nombre en el elemento de servicio y el atributo de contrato en el elemento de punto final no son correctos.Deben ser nombres totalmente calificados:

<service name="namespace.MyService"> 
     <endpoint contract="namespace.IMyService" > 

Una vez que cambie los valores para que sean nombres totalmente calificados que deberían resolver su error.

+0

Esta configuración es correcta; +1000 – CompanyDroneFromSector7G

1

En mi caso, el problema era un espacio de nombre mal llamado. HTH

1

Usando el visual studio 2013 "Agregar" -> La opción de menú "Servicio" creó las secciones de configuración web pero el "contrato" del "punto final" se configuró con el nombre de la clase concreta y no la interfaz.

Tan pronto como corregí todo comenzó a funcionar.

Cuestiones relacionadas