none
consulta para hostear wcf en un proyecto de aplicacion consola RRS feed

  • Pregunta


  • saludos, he realizado un proyecto wcf ty lo he hosteado en una aplicacion de consola

    con este codigo

     Uri httpUrl = new Uri("http://localhost:8090/Servicio/Expediente");
              
                //Create ServiceHost
                ServiceHost host
                = new ServiceHost(typeof(wcfGestionNoContaminacion.servicioExpediente), httpUrl);
                //Add a service endpoint
                host.AddServiceEndpoint(typeof(wcfGestionNoContaminacion.IservicioExpediente)
                , new WSHttpBinding(), "");        

    ahora quiero exponer otra interfase y pongo el mismo codigo pero con el cambio

     = new ServiceHost(typeof(wcfGestionNoContaminacion.servicionuevo), httpUrl);
                //Add a service endpoint
                host.AddServiceEndpoint(typeof(wcfGestionNoContaminacion.Iservicionuevo)
                , new WSHttpBinding(), "");

    pero al querer generar el proxy en el cliente no encuentra esa url como puedo hostearlo correctamente

    martes, 9 de junio de 2015 15:05

Respuestas

  • Hola sergio gracias por tu respuesta . aun no lo pruebo ,pero he visto que esta sería otra solución . ahi en el link

    http://www.c-sharpcorner.com/uploadfile/dhananjaycoder/multiple-service-contracts-in-wcf-service/

    domingo, 14 de junio de 2015 16:47

Todas las respuestas

  • hola

    pero alli veo que estas exponiendo ambos host con la misma url

    usas la misma httpUrl en la definicion de ambos host

    ServiceHost

    sino podrias declarar un baseAddress y definir un service endpoint

    en el ejemplo veras como lo utiliza, alli define un NetTcpBinding, pero podrias definirlo tambien como web

    How to: Specify a Service Binding in Code

    podrias usar el WsHttpBinding

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Karen Malagón martes, 9 de junio de 2015 23:00
    • Marcado como respuesta Karen Malagón miércoles, 10 de junio de 2015 16:17
    • Desmarcado como respuesta palermo_software miércoles, 10 de junio de 2015 21:03
    • Votado como útil palermo_software miércoles, 10 de junio de 2015 21:03
    martes, 9 de junio de 2015 16:06
  • no veo la diferencia entre ese codigo y el que yo hago

    miércoles, 10 de junio de 2015 21:03
  • en tu interfaz IServicioNuevo tienes definido [ServiceContract] y [OperationContract]???

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    miércoles, 10 de junio de 2015 21:14
    Moderador
  • o,en su implementación no tienes [ServiceCobtract] ni [OperationContract] tampoco??

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 10 de junio de 2015 21:27
    Moderador
  • en tu interfaz IServicioNuevo tienes definido [ServiceContract] y [OperationContract]???

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    si lo tengo definido
    miércoles, 10 de junio de 2015 22:09
  • hola. Que mensaje obtienes cuando intentas crear el proxy? Utilizas por ejemplo para probar el WCFTestClient de VS?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    miércoles, 10 de junio de 2015 22:13
    Moderador
  • ahorita no puedo probarlo

    pero la cuestion esque me deje hostear mas de una onterfaz en la misma url u otra mediante codigo

    miércoles, 10 de junio de 2015 23:39
  • Pero tiene que estar "arrancado" o un servicio U otro. Los dos apuntando al mismo URL no aplica

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 11 de junio de 2015 15:59
    Moderador
  • Pero tiene que estar "arrancado" o un servicio U otro. Los dos apuntando al mismo URL no aplica

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    digamos que este en dos url distintas pero con mas de una interfaz de contrato y que el host pueda hostear ambas al mismo tiempo

    eso aplica??

    jueves, 11 de junio de 2015 16:17
  • si te creas dos service hosts pero cada uno con una url diferente si aplica

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 11 de junio de 2015 16:20
    Moderador
  • y cada host una única interfaz o contrato

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 11 de junio de 2015 16:36
    Moderador
  • y cada host una única interfaz o contrato

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    tienes un ejemplo de codigo asi como yo lo estoy haciendo lineas arriba

    eso es justamente lo que no he logrado

    jueves, 11 de junio de 2015 16:41
  • simplemente instancia una nueva URI (Uri httpUrl2 = new Uri(....); )pero que sea diferente a la que has mostrado e instancia otro ServiceHost (ServiceHost host2 = new ServiceHost(.....);)

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 11 de junio de 2015 17:01
    Moderador
  • lo pongo como comentas y al parecer hostea ok ,

    pero luego al querer consumirlo no encuentra la url 

     Uri httpUrl = new Uri("http://localhost:8090/Servicio/Expediente");
    
                Uri httpUrl1 = new Uri("http://localhost:8091/Servicio/Service");
    
                //Create ServiceHost
                ServiceHost host
                = new ServiceHost(typeof(wcfGestionNoContaminacion.servicioExpediente), httpUrl);
                //Add a service endpoint
                host.AddServiceEndpoint(typeof(wcfGestionNoContaminacion.IservicioExpediente)
                , new WSHttpBinding(), "");
    
    
                ServiceHost host2
             = new ServiceHost(typeof(wcfGestionNoContaminacion.Service1), httpUrl1);
                //Add a service endpoint
                host2.AddServiceEndpoint(typeof(wcfGestionNoContaminacion.IService1)
                , new WSHttpBinding(), "");
    
                host.Open();
                host2.Open();
    

    jueves, 11 de junio de 2015 17:44
  • ok... Debes publicar el endpoint de los metadata de tu host2

    ServiceMetadataBehavior mb = new ServiceMetadataBehavior();
    host2.Description.Behaviors.Add(mb);
    
    
     mb.HttpsGetEnabled = true;
     mb.HttpGetEnabled = true;
     host2.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpsBinding(), "mex");
        


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    jueves, 11 de junio de 2015 18:40
    Moderador
  • por favor no me pongas codigo por pedazos porque no se bien donde va

    y me ahora me sale error

        Uri httpUrl = new Uri("http://localhost:8090/Servicio/Expediente");
    
                Uri httpUrl1 = new Uri("http://localhost:8091/Servicio/Service");
    
                //Create ServiceHost
                ServiceHost host
                = new ServiceHost(typeof(wcfGestionNoContaminacion.servicioExpediente), httpUrl);
                //Add a service endpoint
                host.AddServiceEndpoint(typeof(wcfGestionNoContaminacion.IservicioExpediente)
                , new WSHttpBinding(), "");
    
    
                ServiceHost host2
             = new ServiceHost(typeof(wcfGestionNoContaminacion.Service1), httpUrl1);
                //Add a service endpoint
                host2.AddServiceEndpoint(typeof(wcfGestionNoContaminacion.IService1)
                , new WSHttpBinding(), "");
    
                host2.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpsBinding(), "mex");
    
                host.Open();
                host2.Open();
                

    jueves, 11 de junio de 2015 19:46
  • acepta mis disculpas... A veces es dificil el escribir código desde un teléfono móvil.

    a ver si con esto te funciona

    Uri httpUrl = new Uri("http://localhost:8090/Servicio/Expediente"); Uri httpUrl1 = new Uri("http://localhost:8091/Servicio/Service"); //Create ServiceHost ServiceHost host = new ServiceHost(typeof(wcfGestionNoContaminacion.servicioExpediente), httpUrl); //Add a service endpoint host.AddServiceEndpoint(typeof(wcfGestionNoContaminacion.IservicioExpediente) , new WSHttpBinding(), ""); ServiceHost host2 = new ServiceHost(typeof(wcfGestionNoContaminacion.Service1), httpUrl1); //Add a service endpoint host2.AddServiceEndpoint(typeof(wcfGestionNoContaminacion.IService1) , new WSHttpBinding(), "");

    ServiceMetadataBehavior mb = new ServiceMetadataBehavior();
    host2.Description.Behaviors.Add(mb);


     mb.HttpsGetEnabled = true;
     mb.HttpGetEnabled = true;

    host2.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpsBinding(), "mex"); host.Open(); host2.Open();



    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 11 de junio de 2015 19:51
    Moderador
  • no funciono,lo psue tal cual

    jueves, 11 de junio de 2015 21:25
  • perdona... Error tipografico

    esta linea mb.HttpsGetEnabled = true; de

    https debe ser a false

    mb.HttpsGetEnabled = false;


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 11 de junio de 2015 21:31
    Moderador
  • hola aun no lo pruebo

    una consulta asi sin probar

    toda esta linea

    host2.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpsBinding(), "mex");

    no deberia utilizarla para el host 1 tambien

    saludos

    jueves, 11 de junio de 2015 23:13
  • Yo lo aplicaría.

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    viernes, 12 de junio de 2015 4:27
    Moderador
  • igual no me funciono

    sale una pantalla de error similar al anterior

    viernes, 12 de junio de 2015 4:47
  • Ayyy!!! Ya he visto el error mio.

     Sorry sorry

    ost2.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpsBinding(), "mex");

    hay que cambiarlo por

    ost2.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");

    No establecer el binding para https a menos que lo requieras.

    Si lo requieres necesitas establecer una Uri https y hacer mb.HttpsGetEnabled = true


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    viernes, 12 de junio de 2015 7:08
    Moderador
  • Aquí te paso un ejemplo completo probado y funcionando

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using System.Text;
    using System.Threading.Tasks;
    using System.Xml.Serialization;
    
    namespace ConsoleApplication
    {
        [ServiceContract]
        public interface IHelloWorldService
        {
            [OperationContract]
            string SayHello(string name);
        }
    
        public class HelloWorldService : IHelloWorldService
        {
            public string SayHello(string name)
            {
                return string.Format("Hello, {0}", name);
            }
        }
    
        [ServiceContract]
        public interface IHelloWorldService2
        {
            [OperationContract]
            string SayHello(string name);
        }
    
        public class HelloWorldService2 : IHelloWorldService2
        {
            public string SayHello(string name)
            {
                return string.Format("Hello2, {0}", name);
            }
        }
    
    
        class Program
        {
            static void serviceHost_Faulted(object sender, EventArgs e)
            {
                Console.WriteLine("ServiceHost "+ (sender as ServiceHost).BaseAddresses + " has faulted.");
            }
    
            static void Main(string[] args)
            {
                Uri baseAddress = new Uri("http://localhost:1234/HelloService1");
                Uri baseAddress2 = new Uri("http://localhost:4321/HelloService2");
    
    
                using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
                {
                    using (ServiceHost host2 = new ServiceHost(typeof(HelloWorldService2), baseAddress2))
                    {
                        host.Faulted += new EventHandler(serviceHost_Faulted);
                        host2.Faulted +=new EventHandler(serviceHost_Faulted);
     
    
                        //Add a service endpoint
                        host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), "");
    
                        ServiceMetadataBehavior mb = new ServiceMetadataBehavior();
                        mb.HttpsGetEnabled = false;
                        mb.HttpGetEnabled = true;
                        mb.HttpGetUrl = baseAddress;
                        host.Description.Behaviors.Add(mb);
    
                        host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
    
    
    
                        //Add a service endpoint
                        host2.AddServiceEndpoint(typeof(IHelloWorldService2), new BasicHttpBinding(), "");
    
                        ServiceMetadataBehavior mb2 = new ServiceMetadataBehavior();
                        mb2.HttpsGetEnabled = false;
                        mb2.HttpGetEnabled = true;
                        mb2.HttpGetUrl = baseAddress2;
                        host2.Description.Behaviors.Add(mb2);
    
                        host2.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
    
                        host.Open();
                        host2.Open();
    
                        Console.WriteLine("Press <Enter> to terminate the Host application.");
                        Console.WriteLine();
                        Console.ReadLine();
    
                        host.Close();
                        host2.Close();
                    }
                }
    
     
            }
        }
    }
    


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    viernes, 12 de junio de 2015 8:06
    Moderador
  • Hola sergio gracias por tu respuesta . aun no lo pruebo ,pero he visto que esta sería otra solución . ahi en el link

    http://www.c-sharpcorner.com/uploadfile/dhananjaycoder/multiple-service-contracts-in-wcf-service/

    domingo, 14 de junio de 2015 16:47