2010-01-18 38 views
12

estoy tratando de conseguir mi archivo SVC trabajar bajo IIS. En mi proyecto, cuando presiono F5 obtuve el svc funcionando. Entonces sé que todo está bien, ¿verdad? Excepto por IIS.WCF ¿Cómo habilitar los metadatos?

estoy trabajando en una máquina Windows XP Pro y en IIS He añadido un directorio virtual.

Aquí está mi código: IcarePlanActions (proyecto: A)

namespace WcfServiceLibrary 
{ 
    [ServiceContract] 
    public interface ICarePlanActions 
    { 
     [OperationContract] 
     List<string> GetAllClients(); 
    } 
} 

Cliente: (proyecto: A)

namespace WcfServiceLibrary 
{ 
    public class Client : ICarePlanActions 
    { 
     public List<string> GetAllClients() 
     { 
      List<string> clients = new List<string>(); 
      clients.Add("Hendrik de Jong"); 
      clients.Add("Miep de Berg"); 
      clients.Add("Jaap Jongeneel"); 
      clients.Add("Joop Prakman"); 
      clients.Add("Pieter Schaakman"); 

      return clients; 

     } 
    } 
} 

Web.config (Proyecto: B)

<configuration> 
    <system.serviceModel> 
     <services> 
     <service behaviorConfiguration="CarePlanService.Service1Behavior" 
      name="WcfServiceLibrary.Client"> 
      <endpoint address="" binding="wsHttpBinding" contract="WcfServiceLibrary.ICarePlanActions"> 
      <identity> 
       <dns value="localhost" /> 
      </identity> 
      </endpoint> 
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
     </services> 
     <behaviors> 
     <serviceBehaviors> 
      <behavior name="CarePlanService.Service1Behavior"> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
      </behavior> 
     </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 
    </configuration> 

CarePlan.svc

<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceLibrary.Client" %> 

Cuando ejecuto este servicio (que es en IIS) con wfctestclient consigo este error

Error: Cannot obtain Metadata from http://localhost/CarePlanService/CarePlan.svc If this is a Windows (R) Communication Foundation service to which you have access, please check that you have enabled metadata publishing at the specified address.

¿Qué estoy haciendo mal?

SOLUCIÓN

no he tenido el servicio de trabajo bajo IIS. Primero, creo manualmente un directorio virtual y señalo el directorio donde se encuentra el svc. Esto no funcionó. No sé por qué.

Luego fui a Visual Studio y cambia el ajuste del servidor (botón derecho del ratón en el proyecto, las propiedades, ficha Web, haga clic Use local IIS Web Server y haga clic en Create Virtual Directory. Cuando hice esto, funcionó bajo IIS con el código de seguridad.

+0

Título editado: esto no tiene nada que ver con el lenguaje de programación C#. –

+1

No he usado WCF de esta manera, pero ¿debería poner su implementación de servicio dentro del datacontract? y si es así, no hay ningún miembro de datos definido en el contrato. Solo se ve raro para mí. Pero nunca he alojado en IIS ... – magnus

+0

@Martijn: pregunta realmente tonta: cuando intentas conectarte usando WcfTestClient, ¿está activo el sitio web? Si haces los cambios propuestos aquí (descarta el [DataContract], usa "mexHttpBinding" para el punto final de mex), no tengo problemas para obtener los metadatos. Pero primero tiene que hacer una "Vista en el navegador" en el archivo * .svc, para iniciar el servidor web incorporado, y luego puede conectarse a la URL con su WcfTestClient –

Respuesta

5

SOLUCIÓN

no he tenido el servicio de trabajo bajo IIS. Primero, creo manualmente un directorio virtual y señalo el directorio donde se encuentra el svc. Esto no funcionó. No sé por qué.

Luego fui a Visual Studio y cambia el ajuste del servidor (botón derecho del ratón en el proyecto, las propiedades, ficha Web, haga clic en el uso local del servidor Web IIS y haga clic en Crear directorio virtual.Cuando hice esto, funcionó bajo IIS con el código anterior.

+0

esto funcionó para mí, lo que significa que funciona en el servidor IIS pero no en el servidor de desarrollo de Visual Studio. ¿Sabes por qué? – superachu

2

hace referencia al contrato de datos como la implementación del servicio. Eso es válido.

[DataContract] 
public class Client : ICarePlanActions 
{ 

<service behaviorConfiguration="CarePlanService.Service1Behavior" 
     name="WcfServiceLibrary.Client"> 

Cambiar esta referencia a la implementación de su servicio! ¿Qué significa la ejecución de su servicio parece?

Quizás solo deba eliminar el atributo DataContract de la clase Client. Además, este no es su "Cliente", es la implementación del servicio.

+0

He editado mi columna de inicio. ¿Es eso lo que quieres decir? – Martijn

+0

Sí. A eso me refería. – Alex

6

Primero, quitar el atributo [DataContract] en el cliente.

Entonces, recompilar y asegúrese de que usted tiene la WcfServiceLibrary.dll en el directorio/bin para su directorio virtual.

Su configuración debe utilizar esta variable para MetadataExchange:

<endpoint address="mex" 
    binding="mexHttpBinding" 
    contract="IMetadataExchange"/> 
+0

He cambiado mis archivos, pero sigo sin hacerlo funcionar. Modifiqué mi startpost con los cambios. – Martijn

0
  1. Run "\%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -i

  2. eliminar el directorio virtual y crear de nuevo.

0

Sólo echa el nombre del servicio en Service.svc archivo

<ServiceHost Language="C#" Debug="true" Service="SvcCalculator.**Calculator**" 
      CodeBehind="**Calculator.svc.cs**" %> 

esperanza de que va a trabajar.

0

asegurarse de que su servicio de espacio de nombres , y servicio de clase nombres corresponden al archivo App.config.

<system.serviceModel> 
    <services> 
    <service name="WcfCustomLibrary.Service1"> 
    <host> 
     <baseAddresses> 
     <add baseAddress = "http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary/Service1/" /> 
     </baseAddresses> 
    </host> 
    </service> 
    </services> 
</system.serviceModel> 


namespace WcfCustomLibrary 
{ 
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in both code and config file together. 
public class Service1 : IService1 
{ 
Cuestiones relacionadas