none
Duda sobre webservice RRS feed

  • Pregunta

  • Estoy empezando con el tema de web services, y ciertamente estoy algo perdido...

    El fin de el servicio es que lo pueda invocar un dispositivo móvil mediante un request de http, por lo que opté por un WCF RESTful, los formatos de mensaje son JSON, pero tengo varias dudas acerca de.

    El servicio se muestra correctamente sobre localhost, sin embargo, para invocarlo desde otro ordenador me envía mensaje de timeout, después de activadas las opciones de iis, en mi caso el 7, cuando lo invoco recibo una respuesta que no es más que una página con el mensaje 404 de servicio no encontrado...

    Así que supongo que es necesario el hosting del servicio sobre IIS, sin embargo, es justo ese el caso en donde estoy perdido, pues solo he encontrado información sobre el hosting de páginas web como tales, pero no de un web service, como se hace este hosteo?

    Además, cuando invoco al servicio (Desde localhost) necesito que mi aplicación cliente cuente con una referencia para dicho servicio, pero en el caso del móvil como se hace esta referencia?

    Gracias de antemano y saludos...

    jueves, 30 de junio de 2011 16:28

Respuestas

  • Hola

    Pasame si puedes el config del servicio que revisemos por si hay algo que está mal. De todas formas me temo que es algo del propio iis. Intenta alojarlo con una aplicación de consola.

    De todas formas te paso un config de un servicio que a mi no me da problemas

     

     <system.serviceModel> 
      <!--
      <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>  
      -->
      <services>
       <service behaviorConfiguration="ServiceDataQuercus.Service1Behavior"
        name="ServiceDataQuercus.DataService">
        <endpoint address="http://localhost:8731/Design_Time_Addresses/ServiceDataQuercus/Service1/"
         behaviorConfiguration="WebBehavior" binding="webHttpBinding"
         contract="QuercusService.IDataService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
         <baseAddresses>
          <add baseAddress="http://localhost:8731/Design_Time_Addresses/ServiceDataQuercus/Service1/" />
         </baseAddresses>
        </host>
       </service>
      </services>
      <behaviors>
       <endpointBehaviors>
        <behavior name="WebBehavior">
         <webHttp />
        </behavior>
       </endpointBehaviors>
       <serviceBehaviors>
        <behavior name="ServiceDataQuercus.Service1Behavior">
         <serviceMetadata httpGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
       </serviceBehaviors>
      </behaviors>
     </system.serviceModel>
     <applicationSettings>
    

    Sustituye en tu config localhost:3743 por 192.168.2.6:3743


    Te paso un link donde tienes un ejemplo de como arrancar un servicio REST sin IIS.

     

    http://msdn.microsoft.com/es-es/library/system.servicemodel.web.webservicehost.aspx

     

    Saludos.


    phurtado
    • Marcado como respuesta Ramon.Rivera domingo, 3 de julio de 2011 18:19
    sábado, 2 de julio de 2011 7:16

Todas las respuestas

  • Hola:

    Respecto al tema de hosting no es necesario alojarlo en IIS basta con hacer una llamada desde otro sitio no a 

    http://localhost/service, sino a http://192.168.1.100/Service.

     

    Si lo quieres alojar en iis mira este post

    http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/1600dc2c-6ac9-4e0f-9855-f2fc490468d3/

     

    Para llamar a servicios REST desde un dispositivo movil puedes utilizar la clase WebClient o el objeto HttpWebRequest.

     

    Saludos.

     

     


    phurtado
    jueves, 30 de junio de 2011 19:32
  • El problema acerca de eso es que en un inicio ni siquiera tenía instaladas las opciones de iis en windows, ocupo el 7, y cuando invocaba el método tenía el problema del timeout...

    Cuando instale-active las opciones de IIS en la máquina puedo hacer la petición, pero la respuesta es un string con el html de la página mostrando un 404 de no encontrado, la petición la estoy haciendo con un httpget, de la siguiente manera:

    HttpGet request = new HttpGet("http://192.168.2.6:3753/Service1.svc/Uno");
    request.setHeader("Accept", "application/json");
    request.setHeader("Content-type", "application/json");
        	
    DefaultHttpClient httpCliente = new DefaultHttpClient();
    HttpResponse Respuesta = httpCliente.execute(request);
    HttpEntity Entity = Respuesta.getEntity();
    

    Es por ello que supuse que era necesario el hosteo, el método del servicio es Uno y no ocupa ningún parámetro, de hecho es solo de prueba y regresa un string...

    jueves, 30 de junio de 2011 23:39
  • Hola:

     

    ¿Has probado desde un explorador a realizar la siguiente petición, desde otra maquina y desde la maquina local? 

    http://192.168.2.6:3753/Service1.svc/.

    Mira este post que te puede servir:

     

    http://codeblitz.wordpress.com/2009/04/27/how-to-host-and-consume-wcf-restful-services/

     

    Fijate como define el contrato 

     

    [OperationContract]
    07     [WebGet(UriTemplate = "/")]
    08     Product[] GetAllProducts();

    Saludos.


    phurtado
    viernes, 1 de julio de 2011 6:12
  • El contrato lo tengo definido de la misma manera...

    [ServiceContract]
      interface IUno
      {
        [OperationContract]
        [WebGet (UriTemplate = "/Uno", 
          BodyStyle = WebMessageBodyStyle.WrappedRequest,
          ResponseFormat = WebMessageFormat.Xml,
          RequestFormat = WebMessageFormat.Xml)]
        string Numero();
      }
    


    Sin embargo, cuando lo invoco desde otra computadora o desde la misma con la dirección ip (192.168.2.6:3743/Service1.svc/Uno) me manda error de conexión caducada, pero cuando hago lo invoco desde localhost no tengo ningún problema.

    Cabe mencionar que si tengo conectividad entre las 2 computadoras, hice un ping entre ambas y me contestan correctamente, alguna idea?

     

    sábado, 2 de julio de 2011 5:42
  • Hola

    Pasame si puedes el config del servicio que revisemos por si hay algo que está mal. De todas formas me temo que es algo del propio iis. Intenta alojarlo con una aplicación de consola.

    De todas formas te paso un config de un servicio que a mi no me da problemas

     

     <system.serviceModel> 
      <!--
      <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>  
      -->
      <services>
       <service behaviorConfiguration="ServiceDataQuercus.Service1Behavior"
        name="ServiceDataQuercus.DataService">
        <endpoint address="http://localhost:8731/Design_Time_Addresses/ServiceDataQuercus/Service1/"
         behaviorConfiguration="WebBehavior" binding="webHttpBinding"
         contract="QuercusService.IDataService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
         <baseAddresses>
          <add baseAddress="http://localhost:8731/Design_Time_Addresses/ServiceDataQuercus/Service1/" />
         </baseAddresses>
        </host>
       </service>
      </services>
      <behaviors>
       <endpointBehaviors>
        <behavior name="WebBehavior">
         <webHttp />
        </behavior>
       </endpointBehaviors>
       <serviceBehaviors>
        <behavior name="ServiceDataQuercus.Service1Behavior">
         <serviceMetadata httpGetEnabled="true" />
         <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
       </serviceBehaviors>
      </behaviors>
     </system.serviceModel>
     <applicationSettings>
    

    Sustituye en tu config localhost:3743 por 192.168.2.6:3743


    Te paso un link donde tienes un ejemplo de como arrancar un servicio REST sin IIS.

     

    http://msdn.microsoft.com/es-es/library/system.servicemodel.web.webservicehost.aspx

     

    Saludos.


    phurtado
    • Marcado como respuesta Ramon.Rivera domingo, 3 de julio de 2011 18:19
    sábado, 2 de julio de 2011 7:16
  • Funcionó muy bien, el objetivo era utilizar el web service sin tener que hostearlo en IIS...

    Lo implemente en un programa de consola con "webservicehost" y abrí los puertos correspondiente en el firewall de windows y en mi caso, también el antivirus...

    Muchas gracias...

    domingo, 3 de julio de 2011 18:19
  • Hola: 

     

    Yo he trabajado en un escenario parecido al tuyo. Una aplicación en un dispositivo y un servicio pero opte por ServiceBus de Azure. Te recomiendo que mires esta opción, aunque es de pago te evita problemas con firewall y demas y aparte te proporciona conexiones https

     

    Saludos.


    phurtado
    domingo, 3 de julio de 2011 18:47