2011-02-07 65 views
31

Ese error de metadatos es lo que obtengo cuando navego al servicio en un navegador. No estoy consumirlo con un clienteWCF La publicación de metadatos para este servicio está actualmente deshabilitada + Error de tipo de contenido

y sí .. Me añadieron <serviceMetadata httpGetEnabled="True"/>, y tengo un punto final definido mex

pero todavía no va a funcionar ..

Así que he creado un servicio de barebones para alojar en IIS7. Instalación nueva de Windows 7 y VS2010.

que habían seguido las instrucciones de esta página a la letra:

http://msdn.microsoft.com/en-us/library/ms733766.aspx

estoy convencido de que esto tiene que haber algún tipo de problema de configuración en IIS 7, pero no seguro. Aquí está mi configuración de servicio:

EDIT:

intenté acceder al servicio con svcutil y obtuve el siguiente error:

The remote server returned an error: (415) Cannot process the message because the content type 'application/soap+xml; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'.. 

también dice: The HTML document does not contain Web service discovery information.

no está seguro de cómo resolverlo Sin embargo ...

.svc file:

<%@ServiceHost language="C#" Debug="true" Service="DestructionServices.TacticalNukeSVC "%>

archivo .cs (que se encuentra en el directorio C: \ Desarrollo \ carpeta HostedDestructionServices \ App_Code):

using System; 
using System.ServiceModel; 

namespace DestructionServices 
{ 
    [ServiceContract] 
    public interface INukeInterface 
    { 
     [OperationContract] 
     string FireMissile(); 

     [OperationContract] 
     string DirectFire(double x, double y, double z); 

     [OperationContract] 
     void EnterCoordinates(double x, double y, double z); 
    } 

    public class TacticalNukeSVC : INukeInterface 
    { 
     public string FireMissile() 
     { 
      return "Boom"; 
     } 

     public void EnterCoordinates(double x, double y, double z) 
     { 
      //bah, who cares about coordinates.. 
     } 

     public string DirectFire(double x, double y, double z) 
     { 
      return "Fired at: " + x + ", " + y + ", " + z; 
     } 
    } 
} 

Web.Config:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.serviceModel> 
    <services> 
     <service name="DestructionServices.Destro" behaviorConfiguration="MetadataBehavior"> 
     <endpoint address="" binding="wsHttpBinding" contract="DestructionServices.INukeInterface" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="MetadataBehavior"> 
      <serviceDebug includeExceptionDetailInFaults="True" httpHelpPageEnabled="True" /> 
      <serviceMetadata httpGetEnabled="True"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

IIS

+1

También, la adición de un nodo baseAddress es ignorada por IIS – KevinDeus

+0

sí, si aloja en IIS, especificando una dirección base es discutible, ya que IIS dicte dónde vive su servicio ... –

Respuesta

69

Su código y configuración parecen correctos, excepto por un pequeño punto:

En su etiqueta <service>, se ha definido un nombre que no parece corresponder a la clase que implementa el servicio de realidad:

<service name="DestructionServices.Destro" ......> 
       ************************** 

pero la clase es:

namespace DestructionServices 
{ 
    ..... 
    public class TacticalNukeSVC : INukeInterface 
    { 

Esos nombres necesitan ¡partido! El atributo name= en la etiqueta <service> en config debe ser exactamente lo que su clase de servicio se llama - plenamente cualificado, con un espacio de nombres - por lo que en su caso aquí, debería ser:

<service name="DestructionServices.TacticalNukeSVC" ......> 
+3

Eso fue exactamente. Gracias Marc. :) – KevinDeus

+1

Gracias Marc, me estaba volviendo loco. Estaba experimentando el mismo problema y había pasado al menos un día en él. –

+0

Wow, esto también lo solucionó, no pude entender por qué todavía recibía el error de falta de unión mex cuando estaba allí. Gracias y +1! – Justin

0

encontramos con un problema similar. Tenía el espacio de nombres incorrecto en mi etiqueta de servicio en web.config en comparación con el espacio de nombres para la clase de servicio en el archivo svc.

web.config

< service name="X.Y.Z.ContentService" behaviorConfiguration="XServiceBehavior"> 

archivo SVC

<%@ ServiceHost Language="C#" Debug="true" Service="X.Y.A.ContentService" %> 

Como se ha visto anteriormente, la etiqueta de servicio en el web.config tenido x.y.z espacio de nombres en el archivo SVC tenía X.Y.A.

(Gracias a Marc)

2

Anteriormente trabajo WCF con buenos ajustes ~ dejó de funcionar y espectáculos - la publicación de metadatos de errores para este servicio está deshabilitado actualmente.

Ajustes MEX, aunque son perfectas, aún WCF muestra anterior de error, la razón: El directorio virtual creado a partir VS IDE no se crea, a pesar de que da mensaje de "éxito" ..

Basta con crear un directorio virtual en IIS manualmente, El error de Bingo está resuelto.

Espero que ayude!

0

Tuve otro problema. Tengo una aplicación IIS asmx, y en el interior he colocado una subcarpeta con svc. Configurado correctamente, pero no me dio los metadatos hasta que encontré esto en web.config en el directorio padre:

<system.web> 
    <webServices> 
    <soapExtensionTypes> 
     <add type="SPFWebService.SPFWebServiceExtension,App_Code" priority="1" group="0" /> 
    </soapExtensionTypes> 
    </webServices> 
</system.web> 

fijo mediante la eliminación de mi nuevo servicio a un directorio independiente.

0

si tiene una clase sin un constructor predeterminado y otros constructores, luego agregue un constructor predeterminado vacío, tuve el mismo problema y lo resolví.

0

Tuve un problema similar. Para cualquiera que se encuentre con esto más tarde. Mi problema era que mi interfaz de servicio no tienen la DataAnnotation [ServiceContract]

[ServiceContract] //<--This was missing 
public interface IServiceInterface 
{ 
    [OperationContract] 
    void Foo(Bar bar) 
    //... 
} 
Cuestiones relacionadas