none
Problema al consumir un web service RRS feed

  • Pregunta

  • Buenas a todos, estoy comenzando con el desarrollo de aplicaciones y estoy teniendo problemas al consumir un WCF.

    El problema puntualmente es a la hora de depurar en mi celular android la aplicación (la estoy haciendo en cross platform) y darle click al botón ingresar del login sencillo que hice me muestra una excepción  "Excepción no controlada (An unhandled exception occured)" y luego no me queda mas opción que cerrar la aplicación debido a que no puedo realizar mas nada.

    Paso el código que estoy utilizando

    public Login()
            {
                InitializeComponent();
                BtnLogin.Clicked += BtnLogin_Clicked;
            }

            private void BtnLogin_Clicked(object sender, EventArgs e)
            {
                if (string.IsNullOrEmpty(EntUsr.Text))
                {
                    LblMensaje.Text = "Ingrese un usuario";
                    EntUsr.Focus();
                    return;
                }
                if (string.IsNullOrEmpty(EntPass.Text))
                {
                    LblMensaje.Text = "Ingrese una contraseña";
                    EntPass.Focus();
                    return;
                }
                WCFPrueba.ServiceConceptClient servicio = new WCFPrueba.ServiceConceptClient();
                servicio.validar_usuarioCompleted += Servicio_validar_usuarioCompleted;
                servicio.validar_usuarioAsync(EntUsr.Text, EntPass.Text);
                LblMensaje.Text = "Validando ...";
                BtnLogin.IsEnabled = false;
                EsperaActInd.IsRunning = true;
            }

            public void Servicio_validar_usuarioCompleted(object sender, WCFPrueba.validar_usuarioCompletedEventArgs e)
            {
                BtnLogin.IsEnabled = true;
                EsperaActInd.IsRunning = false;
                if (e.Result == 0)
                {
                    LblMensaje.Text = "Usuario o contraseña no validos";
                    EntUsr.Text = string.Empty;
                    EntPass.Text = string.Empty;
                    EntUsr.Focus();
                    return;
                }
                LblMensaje.Text = "Ingreso Exitoso";
            }
        }

    <?xml version="1.0" encoding="utf-8" ?>
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 x:Class="AppPrueba.Login"
                 BackgroundColor="Gray">
        <ContentPage.Content>
            <ScrollView>
                <StackLayout Spacing="10" Padding="10">
                    <Label Text="Ingreso al sistema"
                           Font="24"
                           FontAttributes="Bold"
                           TextColor="White"
                           HorizontalOptions="Center"/>
                    <Label x:Name="LblMensaje"
                           Text="Ingrese usuario y contraseña"
                           Font="18"
                           FontAttributes="Bold"
                           TextColor="White"
                           HorizontalOptions="Center"/>
                    <Entry x:Name="EntUsr"
                           Placeholder="Introduzca usuario"/>
                    <Entry x:Name="EntPass"
                           Placeholder="Introduzca clave"
                           IsPassword="True"/>
                    <Button x:Name="BtnLogin"
                            Text="Ingresar"
                            HorizontalOptions="Center"
                            TextColor="White"
                            BackgroundColor="Black"/>
                    <ActivityIndicator x:Name="EsperaActInd"/>
                </StackLayout>
            </ScrollView>
        </ContentPage.Content>
    </ContentPage>

    PD: Depuro en mi celular debido a que mi pc es de 4gb de ram y no puedo ejecutar el emulador, no se si esto habrá influido para poder agregar la referencia de servicio tuve que desinstalar xamarin forms e instalarlo de vuelta (instale la misma versión que había desinstalado) y por ultimo el WCF esta publicado en iis y lo probé utilizando wcf test client abriendo desde el command prompt de visual studio y agregando la dirección que me da el iis y funciona todo correctamente. Muchas gracias de antemano.


    martes, 13 de junio de 2017 15:12

Todas las respuestas

  • Hola

    Pero tu web service está publicado en internet? o en tu red local? asegúrate que puedas acceder al web service desde el navegador del celular.

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    martes, 13 de junio de 2017 15:24
  • Esta publicado en red local, desde mi celular si puedo acceder a la web. Que podría ser? Necesitas el código fuente del WCF?
    martes, 13 de junio de 2017 17:06
  • PabloEG

    Lo comunicas vía http, vía tcp? hiciste algún punto de interrupción y ver donde exactamente se cae?

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    martes, 13 de junio de 2017 17:56
  • Lo comunico vía http e hice un punto de interrupción en:

    EsperaActInd.IsRunning = false; antes del if(e.result==0)

    hasta ese punto todo perfecto pero cuando ejecuta el if se cae la aplicación. Muchas Gracias por responder.

    martes, 13 de junio de 2017 18:40
  • La verdad que no sé que podría estar pasando, a ver adjunta tu code para ver que podemos detectar:

    Por lo pronto intenta descartar, basándote en la documentación oficial en  como se comunican Xamarin con un Servicio WCF 

    Walkthrough - Working with WCF

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    martes, 13 de junio de 2017 21:04
  • Gracias por el enlace lo leo, lo aplico y te comento como me fue.

    martes, 13 de junio de 2017 21:45
  • Buenas leí el articulo y modifique lo necesario para que publicar el wcf en iis express abriendo el puerto que me especifica el articulo, luego a la hora de programar el evento la verdad que no entendí el código para ser honesto soy muy nuevo en esto.

    Puse todo el código arriba, es todo lo que hago en la aplicación ademas de agregar el wcf como referencia de servicio, el evento de click si funciona ya que probe en los controles que hice para que no haya campos en blanco y funciona, el problema es a la hora de ejecutar el :

    public void Servicio_validar_usuarioCompleted(object sender, WCFPrueba.validar_usuarioCompletedEventArgs e)

    Por las dudas al WCF lo maneje de la siguiente manera:

    Creo el WCF y agrego una biblioteca de clases a la solución, a esa biblioteca de clases agrego un conjunto de datos donde conecto mi base de datos en sql server 2014 creo los procedimientos almacenados en la clase que agregue utilizo el siguiente codigo:

    namespace CAD
    {
        public class CADUsuario
        {
            private static UsuariosTableAdapter adapter = new UsuariosTableAdapter();
            public static int LoginUsr(string usr,string pass)
            {
                try
                {
                    return (int)adapter.LoginUsr(usr, pass);
                }
                catch (Exception)
                {

                    return 0;
                }
            }
        }
    }

    referencio la clase al WCF y aplico su interfaz y su implementación en el cual ademas, de la clase agregada del elemento app.config extraigo el siguiente codigo:

    <connectionStrings>
            <add name="CAD.Properties.Settings.db_testConnectionString" connectionString="Data Source=***;Initial Catalog=***;Persist Security Info=True;User ID=***;Password=***"
                providerName="System.Data.SqlClient" />
        </connectionStrings>

    y lo copio en el web.config de el WCF el cual quedaria asi:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>

      <connectionStrings>
        <add name="CAD.Properties.Settings.db_testConnectionString" connectionString="Data Source=***;Initial Catalog=***;Persist Security Info=True;User ID=***;Password=***"
            providerName="System.Data.SqlClient" />
      </connectionStrings>
      <appSettings>
        <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
      </appSettings>
      <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5"/>
      </system.web>
      <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior>
              <!-- Para evitar revelar información de los metadatos, establezca los valores siguientes en false antes de la implementación -->
              <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
              <!-- Para recibir detalles de las excepciones en los fallos, con el fin de poder realizar la depuración, establezca el valor siguiente en true. Para no revelar información sobre las excepciones, establézcalo en false antes de la implementación -->
              <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <protocolMapping>
            <add binding="basicHttpsBinding" scheme="https" />
        </protocolMapping>    
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
      </system.serviceModel>
      <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
        <!--
            Para examinar el directorio raíz de la aplicación web durante la depuración, establezca el valor siguiente en true.
            Establézcalo en false antes de la implementación para evitar revelar información sobre la carpeta de aplicación web.
          -->
        <directoryBrowse enabled="true"/>
      </system.webServer>

    </configuration>

    Eso seria todo lo que hago, al wcf lo pruebo abriendo el command prompt de visual studio y ejecutando el wcf test client agrego el servicio y lo pruebo sin ningún problema.

    Espero que te sirva todo esto para ayudarme.

    Gracias de antemano.

    miércoles, 14 de junio de 2017 14:48
  • Buenas encontré lo que podría ser el problema y es q el web service no posee un endpoint como lo hago en este caso, utilizando un try catch pude ver la excepción que me estaba dando el problema.

    El código web.config esta arriba, gracias de antemano.

    jueves, 15 de junio de 2017 18:41
  • Hola, entonces ya corre con normalidad el login mediante el wcf?

    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    jueves, 15 de junio de 2017 18:55
  • Buenas mil disculpas no me di a entender por escribir rápido, la excepción seria esta:

    InnerException {System.ServiceModel.EndpointNotFoundException} System.ServiceModel.EndpointNotFoundException

    Según mi jefe quien me dio una mano para identificar la excepción, me dijo que falta un endpoint y buscando por google vi varios ejemplos pero la verdad que no se como quedaría realmente ajustado a mi solución. Si puedes orientarme como quedaría me seria de mucha utilidad. El web.config original esta arriba y por lo que vi no hay etiquetas <service></service> y tampoco <endpoint/>.

    jueves, 15 de junio de 2017 19:43
  • Perdon no puse otros datos que al parecer son importantes para agregarlo, la direccion en el cual accedo al web service es:

    http://localhost/WCF/ServiceConcept.svc

    El namespace de mi solución es : WCFPrueba

    y por las dudas la interfaz: iserviceconcept

    y la implementación: serviceconcept

    espero que esto te sirva. Muchas gracias de antemano.

    jueves, 15 de junio de 2017 19:49