2010-05-11 13 views
7

Mis primeros intentos de crear un servicio de alojamiento propio. Tratando de hacer algo que aceptará una cadena de consulta y devolver algo de texto, pero tienen unos cuantos problemas:Servicio de host de WCF: puntos finales en C#

  • toda la documentación habla sobre los puntos finales que se crean automáticamente para cada dirección de base si no se encuentran en una configuración archivo. Esto no parece ser el caso para mí, obtengo la excepción "El servicio tiene cero puntos finales de la aplicación ...". Manualmente especificando un punto final de la base de la siguiente manera parece resolver esto:

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.ServiceModel; 
    using System.ServiceModel.Description; 
    
    namespace TestService 
    { 
        [ServiceContract] 
        public interface IHelloWorldService 
        { 
         [OperationContract] 
         string SayHello(string name); 
        } 
    
        public class HelloWorldService : IHelloWorldService 
        { 
         public string SayHello(string name) 
         { 
          return string.Format("Hello, {0}", name); 
         } 
        } 
    
        class Program 
        { 
         static void Main(string[] args) 
         { 
          string baseaddr = "http://localhost:8080/HelloWorldService/"; 
          Uri baseAddress = new Uri(baseaddr); 
    
          // Create the ServiceHost. 
          using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress)) 
          { 
           // Enable metadata publishing. 
           ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); 
           smb.HttpGetEnabled = true; 
           smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; 
           host.Description.Behaviors.Add(smb); 
    
           host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), baseaddr); 
           host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), baseaddr + "SayHello"); 
    
           //for some reason a default endpoint does not get created here 
           host.Open(); 
    
           Console.WriteLine("The service is ready at {0}", baseAddress); 
           Console.WriteLine("Press <Enter> to stop the service."); 
           Console.ReadLine(); 
    
           // Close the ServiceHost. 
           host.Close(); 
          } 
         } 
        } 
    } 
    
  • ¿Cómo hago para configurar esto para devolver el valor de nombre en SayHello (string name) cuando se le solicite esta manera: localhost: 8080/HelloWorldService/SayHello? name = Kyle

que estoy tratando de caminar antes de correr, pero esto sólo parece que se arrastra ...

+0

¿Está utilizando .NET 3.5 o .NET 4? La característica "crear puntos finales predeterminados para la dirección base" es algo nuevo en .NET 4: no funcionará en 3.5 –

Respuesta

10

Para su pregunta sobre los puntos finales predeterminados no se añade:

  • primero de todo, que es una característica WCF 4 - que funcionará en .NET 4 solamente
  • siguiente, el valor por defecto los puntos finales solo se agregan a su servidor de servicio si no tiene puntos finales explícitos definidos en la configuración, y si usted no agrega los puntos finales usted mismo en el código! Mediante la adición de los dos puntos finales en el código, que está tomando la carga y el tiempo de ejecución de WCF 4 no va a jugar con su configuración

Control hacia fuera este artículo de la biblioteca MSDN para obtener más información sobre What's new in WCF 4 for developers. Muestra, entre otras cosas, cómo usar los puntos finales predeterminados: básicamente define una dirección base para su servicio y abre el ServiceHost, ¡eso es todo!

string baseaddr = "http://localhost:8080/HelloWorldService/"; 
Uri baseAddress = new Uri(baseaddr); 

// Create the ServiceHost. 
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress)) 
{ 
    //for some reason a default endpoint does not get created here 
    host.Open(); 

    // here, you should now have one endpoint for each contract and binding 
} 

También puede agregar los puntos finales predeterminados explícitamente, en el código, si así lo desea. Así que si usted necesita para añadir sus propios criterios de valoración, pero luego desea agregar los puntos finales predeterminados del sistema, puede utilizar:

// define and add your own endpoints here 

// Create the ServiceHost. 
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress)) 
{ 
    // add all the system default endpoints to your host 
    host.AddDefaultEndpoints(); 

    //for some reason a default endpoint does not get created here 
    host.Open(); 

    // here, you should now have your own endpoints, plus 
    // one endpoint for each contract and binding 
} 

También fonud this blog post here ser bastante esclarecedor - Blog de Christopher está lleno de buena y muy útil WCF publicaciones - muy recomendado

+0

Gracias Marc, definitivamente revisaré esos libros. Estoy en la desafortunada posición de no poder usar .NET4 todavía, pero gracias también por el enlace al blog de Chris, parece que tengo una buena lectura por delante. Estoy buscando usar WebServiceHost en su lugar, ya que todo lo que realmente necesito hacer es realizar una acción solicitada a través de una solicitud HTTP GET y devolver una pequeña cantidad de datos. – Kyle

0

Si IIS hospeda el servicio web, se obtiene la amigable "que ha creado una página de servicio web, suponiendo que nada más está mal. Es posible que desee probar algunos tutoriales WCF rápidos, como se puede encontrar en el libro de Bustamente Learning WCF, van rápido y explican mucho.

EDIT: Here's an MSDN page que muestra una forma de obtener los parámetros de cadena de consulta fuera de la llamada de servicio solicitada, buen ejemplo. Muestra el uso del atributo [WebGet]. Si no desea utilizar eso, puede intentar usar OperationContext para acceder a la parte interna de la solicitud entrante.

+0

Gracias, he estado buscando libros decentes, lo verificaré. – Kyle

3

En cuanto a los libros, aquí está mi recomendación: el libro que siempre recomiendo que se ponga en marcha en WCF rápidamente es Learning WCF por Michele Leroux Bustamante. Ella cubre todos los temas necesarios, y de una manera muy comprensible y accesible. Esto le enseñará todo: aspectos básicos, temas intermedios, seguridad, control de transacciones, etc., que necesita saber para escribir servicios WCF de alta calidad.

Learning WCF http://ecx.images-amazon.com/images/I/41wYa%2BNiPML._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

Los temas más avanzados y más profundo vistazo a WCF será cubierto por Programming WCF Services por Juval Lowy. Realmente se sumerge en todos los detalles técnicos y temas y presenta "la Biblia" para la programación de WCF.

Programming WCF Services http://ecx.images-amazon.com/images/I/41H2u13a9bL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

Cuestiones relacionadas