none
Como consumir un Webservice desde WP7 vs WM6 RRS feed

  • Pregunta

  • Estamos adaptando una aplicacion que conecta con un servicio Web y que desde WM6 funciona perfectamente. Ahora bien, desde WP7 no vemos como realizar los mismos pasos pero utilizando WCF en lugar de referencias Web como haciamos en WM6, pongo lo que teniamos en WM6 a ver si alguien nos puede dar una pista para WP7:

    Public Shared LKXservices As New LKXServices.LKXSoftware()

    LKXservices.Url = "http://" & URLreal & "/WS2/MobileToService.php"

    LKXservices.Timeout = 30000

    RespuestaWSLKX = LKXservices.getA2("Proceso", XmlSend)

    If System.IO.File.Exists(WorkXML & "\ResLKX.xml") = True Then

    System.IO.File.Delete(WorkXML & "\ResLKX.xml")

    End If

    GrabarXML(RespuestaWSLKX , "ResLKX")

    Como podeis observar se invoca getA2 pasando dos parametros y obtenemos el resultado. Pero en WP7 ocurre que al agregar una Referencia de Servicio, no me aparece la funcion getA2 como tal, aparece una BegingetA2 y otra EndgetA2.

    Al instanciar la BegingetA2 me aparece dos parametros mas que en WM6 y aparece esto:

    Public Shared WS_LKX As WS_LKXSoftware.LKXSoftwarePortType (Esto ya cambia respecto a WM6)

    WS_LKX.BegingetAllianz2("proceso",XMLMarca, callback as System.asyncCallback, asynState as Object)  (me agrega el callback y el asyncState, Porque?)

    y ya no se como definir el timeout, ni como obtener la respuesta del servicio web ni tampoco efectuar la peticion.

    la otra parte es que el XML del resultado siempre lo guardamos en el dispositivo en un log de operaciones.

     

    si me podeis hechar un cable, os lo agradeceriamos.

    

    Muchas Gracias de antemano

    martes, 22 de marzo de 2011 19:42

Respuestas

Todas las respuestas

  • No tengo ni idea de WCF, pero esos dos metodos que comentas son los que se usan en .NET para implementar llamadas asincronas (no bloqueantes). Es muy raro que el servicio tenga esas dos llamadas pero no tenga la llamada normal (la bloqueante...).

    Esta es la doc sobre este tipo de llamadas y como se usan:

    http://msdn.microsoft.com/en-us/library/ms228963.aspx

    Para lo del fichero, necesitas usar el namespace IsolatedStorage, la docu la tienes aqui:

    http://msdn.microsoft.com/en-us/library/system.io.isolatedstorage(VS.95).aspx


    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    miércoles, 23 de marzo de 2011 4:12
  • Buenas!

    En Silverlight para Windows Phone todas las llamadas  a servicios web (WCF) se realizan de forma asíncrona, no crea los métodos síncronos ni permite acceder a ellos, esto es así por requerimientos de las guias de diseño de aplicaciones de Microsoft, de esta forma es imposible bloquear la UI con llamadas a servicios externos.

    Un saludo!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    miércoles, 23 de marzo de 2011 7:21
    Moderador
  • Ya se algo mas :D Thanks!
    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    miércoles, 23 de marzo de 2011 15:08
  • Hola!

    ¿se ha resuelto tu duda?

    Si es así, por el buen funcionamiento general del foro y para que cualquier otro usuario pueda encontrar la respuesta correcta al problema planteado, por favor marca la respuesta/s que te haya ayudado como correcta.

    Si has encontrado la solución por ti mismo, por favor, toma 5 minutos en escribirla aquí como una respuesta más y marcala como correcta para la misma finalidad.

    Un saludo y gracias por tu colaboración.


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    domingo, 27 de marzo de 2011 8:33
    Moderador
  • Pues la verdad es que no, pues estas lineas:

    Public Shared LKXservices As New LKXServices.LKXSoftware()

    LKXservices.Url = "http://" & URLreal & "/WS2/MobileToService.php"

    LKXservices.Timeout = 30000

    RespuestaWSLKX = LKXservices.getA2("Proceso", XmlSend)

    ________________________________________________________________

    No tengo ni idea de como realizarlas en WP7, pues la ultima, la que instancia a la funcion del servicio, no se como realizarla en silverlight o wp7. Se que se ha de utilizar:(creo haber visto)

    1º el Webrequest.create(URI)  

    2º webrequest.method= "POST"

    3º webrequest.contenttype="text/xml"

    pero a partir de aqui, no se como incorporar la llamada a getA2 y pasarle los dos parametros para recibir la respuesta.

    Si me podeis dar un capote, os lo agradeceria.

    Saludos.

    lunes, 28 de marzo de 2011 23:21
  • Buenas!

    Puedo tener acceso a ese servicio web para probarlo y ver como puedo ayudarte??

    si no...

    -- ¿Como lo tienes referenciado en el proyecto?

    -- LKXServices que es exactamente???

    -- Cuando accedes a los metodos de LKXservices.------ que te muestra el intellisense??

    Un abrazo!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    martes, 29 de marzo de 2011 6:19
    Moderador
  • Hola Josue,

    Si me proporcionas un mail, te remito un XML de ejemplo para atacar al servicio, y el parametro que se debe utilizar para los procesos.

    A tu primera pregunta supongo es esto:

    En el proyecto lo tengo como Agregado como referencia de servicio, y esta es la url :

    http://lkxsoftware.es/webservice2/mobiletoservice0.php?wsdl el servicio a utilizar es el getAllianz2.

    A la segunda pregunta:

    Public Shared LKXservices As New WS_LKXServices.LKXSoftware() estaba mal pero imagino que es a WS_LKXServices es el espacio de nombres que le doy al Agregar la referencia de servicio.

    A la tercera pregunta:

    El intellisense me muestra las funciones del servicio finalizadas con con CompletedEventArgs (getallianz2CompletedEventArgs)  y ademas las dos Portype y PorTypeChannel.

    Si necesitas mas informacion, te la remito al mail.

    Muchas Gracias.

    martes, 29 de marzo de 2011 19:39
  • Hola Josue,

    Por lo que veo, no sólo para todas las llamadas a servicios web (WCF) sino también a los servicios web clásicos, añadidos desde el wizar "Añadir referencía".

    Todas las llamadas se deben hacer asincronamente.

    martes, 29 de marzo de 2011 21:36
  • Esto, no decias al principio que el metodo se llamaba Begin no se que? Ahora dices que tienen un NosequeCompletedEventArgs, eso es otra forma totalmente diferente que tiene el framework de hacer llamadas asincronas, la documentacion para este tipo esta aqui:

    http://msdn.microsoft.com/en-us/library/e7a34yad(VS.80).aspx

    Si no estas usando Task (que creo no esta soportado en el Phone), es la manera que se recomienda actualmente para manejar llamadas asincronas.


    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    miércoles, 30 de marzo de 2011 1:46
  • Hola Vicente,

    Te explico lo que aparece en cada caso y juzga tu si uso una u otra cosa:

    1º- Agrego Referencia de servicio -> pongo la url del Servicio Web -> en Espacio de Nombres pongo -> WS_LKXServices

    2º- Declaro un objeto:  Public Shared WS_LKX As WS_LKXSoftware.  y al poner el punto aparecen estas funciones:

    getAllianz2CompletedEventArgs

    LKXSoftwarePortType

    LKXSoftwarePortTypeChannel

    LKXSoftwarePortTypeClient

    y por lo que he leido en diferentes sitios, escojo LKXSoftwarePortType quedando la declaracion de esta manera:

    Public Shared WS_LKX As WS_LKXSoftware.LKXSoftwarePortType

    3º  para utilizar la funcion del servicio, procedo a asignar a una variable declarada para almacenar el resultado de la respuesta, la llamada a getallianz2 de la siguiente manera

        comienzo con:  Respuesta = WS_LKX.   en ese momento al poner el punto aparecen las tres funciones que te indico:

                                          BegingetAllianz2

                                          EndgetAllianz2

                                          GetType

    el resultado de la declaracion queda asi: 

          WS_LKX.BegingetAllianz2()

         dentro del parentesis, la funcion solicita los parametros que se han de pasar al Servicio Web que son dos:

             Servicio As String, XMLSend as String,

         y otros dos que en el .Net no me los solicitaba:

             callback As System.AsyncCallback, asyncState as object

        de los cuales entiendo que que el callback a de ser una llamada a la funcion que gestiona la respuesta obtenida mediante la llamada al Servicio Web, y el asyncState un objeto declarado al que le asigno una clase que unicamente tiene declarados dos objetos como HttpWebRequest y HttpWeResponse.

     

    No se si te sirve todo lo que he explicado, espero que si. A mi por lo menos me ha servido para ordenar las ideas y creo que a diferencia del codigo en .NET donde la llamada al servicio me devuelve un String que lo trato directamente, entiendo que en WP7 todo se trata en asincrono y por tanto no obtengo una valor String de respuesta, sino que debo tratar todo mediante una funcion que gestione el resultado y a la que se le llega un unico parametro declarado como IAsyncResult y que contiene el XML de respuesta de la a tratar.  

    Voy a revisar el codigo y a poner esta reflexion a probar, y si me funciona, os lo digo y cerramos este hilo como resuelto.

    Gracias a Todos por la Ayuda.

    miércoles, 30 de marzo de 2011 22:07
  • Si, mucho mas claro, y en la llamada a Begin los parametros que dices (el callback y el object) son para lo que comentas (el callback se ejecuta al terminar la llamada al servicio y el object es simplemente un cajon desastre para guardar lo que quieras).

    A ver si te funciona :)


    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    miércoles, 30 de marzo de 2011 23:59
  • Bueno,

    Lo he intentado, pero no me acaba de salir. Te adjunto como he dejado el codigo, las dudas y el error que me aparece:

    El codigo:

    En el MainPage.xaml.vb tengo definido lo siguiente:

      Public Shared WS_LKX As WS_LKXSoftware.LKXSoftwarePortType
      Public Shared WS_response As Xml.XmlReader
      Public Shared XMLMarca As String

    En el Proceso.xaml.vb tengo definido lo siguiente:

      Dim LKXUri As New UriBuilder(MainPage.URLreal)
      Dim RespuestaLKX As HttpWebRequest = CType(WebRequest.Create(LKXUri.Uri), HttpWebRequest)
      Dim StateLKX As New ForecastUpdateState()
       RespuestaLKX.Method = "POST"
       StateLKX.AsyncRequest = RespuestaLKX
      Dim CallbackLKX As New AsyncCallback(AddressOf HandleForecastResponse)
      Try
        MainPage.WS_LKX.BegingetAllianz2("TarificaAutos", MainPage.XMLMarca, CallbackLKX, StateLKX)
      Catch ex As Exception
        MessageBox.Show(ex.ToString)
      End Try
    ----------------------......

    Public Class ForecastUpdateState
     Public Property AsyncRequest() As HttpWebRequest
     Public Property AsyncResponse() As HttpWebResponse
    End Class

    Mis Dudas:

    Si utilizo WS_LKX.BegingetAllianz2(...) para la llamada a mi webservice, donde le defino el timeout, y como me asocia esta instruccion al WebRequest.Create de RespuestaLKX

     


    El error es este :

    NullReferenceException
       at Pocket_Segur_7.Vehiculo..ctor()
       at System.Reflection.RuntimeConstructorInfo.InternalInvoke(RuntimeConstructorInfo rtci, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
       at System.Reflection.RuntimeConstructorInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)
       at System.Activator.InternalCreateInstance(Type type, Boolean nonPublic, StackCrawlMark& stackMark)
       at System.Activator.CreateInstance(Type type)
       at System.Windows.Navigation.PageResourceContentLoader.BeginLoad_OnUIThread(AsyncCallback userCallback, PageResourceContentLoaderAsyncResult result)
       at System.Windows.Navigation.PageResourceContentLoader.<>c__DisplayClass4.<BeginLoad>b__0(Object args)
       at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)
       at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)
       at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
       at System.Delegate.DynamicInvokeOne(Object[] args)
       at System.MulticastDelegate.DynamicInvokeImpl(Object[] args)
       at System.Delegate.DynamicInvoke(Object[] args)
       at System.Windows.Threading.DispatcherOperation.Invoke()
       at System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority)
       at System.Windows.Threading.Dispatcher.OnInvoke(Object context)
       at System.Windows.Hosting.CallbackCookie.Invoke(Object[] args)
       at System.Windows.Hosting.DelegateWrapper.InternalInvoke(Object[] args)
       at System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams, ScriptParam& pResult)

    En fin, seguro que algo se me esta escapando, pero no lo acabo de localizar, a ver si vosotros lo localizais, mientras lo seguire probando y buscando.

    Saludos y Gracias por vuestra cooperacion.

    martes, 5 de abril de 2011 0:32
  • Hay algo que es nulo en el constructor de tu clase Vehiculo, o eso dice la excepcion, no parece problema del servicio... No puedes ver la linea en la que da el problema?
    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    martes, 5 de abril de 2011 6:16
  • Si,

    al usar el debuger, me se para en esta linea:

    MainPage.WS_LKX.BegingetAllianz2("TarificaAutos", MainPage.XMLMarca, CallbackLKX, StateLKX)

    Por lo que entiendo que ha de ser que hay algun problema con la respuesta o con la llamada al servicio.

    Gracias

    miércoles, 6 de abril de 2011 22:38
  • Ya, pero si te fijas la traza de la excepcion dice:

    NullReferenceException

       at Pocket_Segur_7.Vehiculo..ctor()

    Tiene pinta que tu servicio por algun sitio construye un Vehiculo de esos, y al intentar construirlo, peta y te devuelve el error el servicio. Has mirado si dentro del constructor te puede salir esa exception por algun lado?


    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    jueves, 7 de abril de 2011 0:53
  • Vicente, te podria hacer llegar un zip con el proyecto? ese vehiculo es el XAML original en lugar de proceso.xaml.vb. La cuestion es que no consigo que me funcione la llamada, y es la clave de la aplicacion.

    TE dejo el codigo completo del xaml.vb

    Imports System.IO
    Imports System.Collections.ObjectModel
    Imports System.Xml.Linq

    Partial Public Class Vehiculo
        Inherits PhoneApplicationPage
        Public arr_Vehiculo(1) As MainPage.Vehiculo
        Public arr_AR_Vehiculo(1) As MainPage.AR_Vehiculo

        Public Shared callback As AsyncCallback

        Public XML_Marca, XML_Result As String
        Public WSLKX As WS_LKXSoftware.LKXSoftwarePortType
       
        Public Class ForecastUpdateState
            Public Property AsyncRequest() As HttpWebRequest
            Public Property AsyncResponse() As HttpWebResponse
        End Class


        Public Sub New()
            InitializeComponent()
            If MainPage.Array_AR_Vehiculo(1).Marca <> Nothing Then
                IniciaCampos()
            Else
                MainPage.XMLMarca = "<?xml version='1.0' encoding='ISO-8859-1'?>"
                MainPage.XMLMarca += "<RDataVehiclesRequest>"
                MainPage.XMLMarca += "<Manufacturer></Manufacturer>"
                MainPage.XMLMarca += "<Group></Group>"
                MainPage.XMLMarca += "<Model></Model>"
                MainPage.XMLMarca += "</RDataVehiclesRequest>"
                MainPage.URLreal = "http://lkxsoftware.es/webservice2/mobiletoservice0.php"

                Dim LKXUri As New UriBuilder(MainPage.URLreal)
                Dim RespuestaLKX As HttpWebRequest = CType(WebRequest.Create(LKXUri.Uri), HttpWebRequest)
                Dim StateLKX As New ForecastUpdateState()
                RespuestaLKX.Method = "POST"
                StateLKX.AsyncRequest = RespuestaLKX
                Dim CallbackLKX As New AsyncCallback(AddressOf HandleForecastResponse1)
                XML_Marca = MainPage.XMLMarca

                Try
                    WSLKX.BegingetAllianz2("TarificaAutos", XML_Marca, CallbackLKX, StateLKX)

                Catch ex As Exception
                    MessageBox.Show(ex.ToString)
                End Try


            End If

        End Sub

        Public Sub HandleForecastResponse1(ByVal asyncResult As IAsyncResult)
            ' get the state information
            Dim forecastState As ForecastUpdateState = CType(asyncResult.AsyncState, ForecastUpdateState)
            Dim forecastRequest As HttpWebRequest = CType(forecastState.AsyncRequest, HttpWebRequest)

            ' end the async request
            forecastState.AsyncResponse = CType(forecastRequest.EndGetResponse(asyncResult), HttpWebResponse)

            Dim streamResult As Stream

            Dim newmodel As String = ""
            Dim newversion As String = ""
            Dim newtype As String = ""

            ' create a temp collection for the new forecast information for each
            ' time period
            Dim newForecastList As New ObservableCollection(Of ForecastPeriod)()

            Try
                ' get the stream containing the response from the async call
                streamResult = forecastState.AsyncResponse.GetResponseStream()

                ' load the XML
                Dim xmldata As XElement = XElement.Load(streamResult)

                ' start parsing the XML.  You can see what the XML looks like by
                ' browsing to:
               
                Dim xmlCurrent As XElement = xmldata.Descendants("totalResultsCount").First()
                Dim Countmodels As Integer
                Countmodels = CInt(xmlCurrent.Value)
                ' find the code element and retrieve the name, lat, lng information
                xmlCurrent = xmldata.Descendants("code").First()

                Dim indexmark As Integer = 1
                Do While indexmark < Countmodels
                    newmodel = CStr(xmlCurrent.Element("name"))
                    newversion = CStr(xmlCurrent.Element("version"))
                    newtype = CStr(xmlCurrent.Element("type"))
                    xmlCurrent = xmldata.Descendants("code").ElementAt(indexmark)
                    indexmark += 1
                Loop

            Catch e2 As FormatException
                ' there was some kind of error processing the response from the web
                ' additional error handling would normally be added here
                Return
            End Try
        End Sub


        Private Sub IniciaCampos()
            LB_MARCA.SelectedIndex = MainPage.Array_AR_Vehiculo(1).MarcaIndex
            LB_GAS.SelectedIndex = MainPage.Array_AR_Vehiculo(1).CombustibleIndex
            LB_MODELO.SelectedIndex = MainPage.Array_AR_Vehiculo(1).ModeloIndex
            LB_VERSION.SelectedIndex = MainPage.Array_AR_Vehiculo(1).VersionIndex
        End Sub


        Private Sub Image1_GotFocus(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Image1.GotFocus, Button1.Click
            LB_MARCA.Items.Clear()
            MainPage.Array_AR_Vehiculo(1).Marca = Nothing
            LB_GAS.Items.Clear()
            MainPage.Array_AR_Vehiculo(1).Combustible = Nothing
            LB_MODELO.Items.Clear()
            MainPage.Array_AR_Vehiculo(1).Modelo = Nothing
            LB_VERSION.Items.Clear()
            MainPage.Array_AR_Vehiculo(1).Version = Nothing
            IniciaCampos()
        End Sub

    End Class

     

    martes, 12 de abril de 2011 0:16
  • Pero has depurado el constructor de Vehiculo o no? Puede ser por ejemplo que Array_AR_Vehiculo(1) sea nothing o algo asi (tienes por ahi unas cuantas cosas donde un nothing te podria dar la excepcion que te sale).
    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    martes, 12 de abril de 2011 10:41
  • Si, de hecho, es cuando pulso F11 desde el debuger del Visual Studio 2010 en el punto de WSLKX.BegingetAllianz2("TarificaAutos", XML_Marca, CallbackLKX, StateLKX) que me da el error en el catch y ni tan solo entra en la funcion del addressof al CallbackLKX, con lo que dudo que sean las arrays o las variables, aunque esta noche probare a iniciarlas con un valor a ver si es eso.

    Gracias por la paciencia.

    martes, 12 de abril de 2011 18:29
  • Hola LKX Software

    ¿Has resuelto el problema?

    Si alguna respuesta te ha ayudado marcala como correcta para mantener el buen funcionamiento del foro!

    Un saludo!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    viernes, 22 de abril de 2011 1:28
    Moderador
  • Buenas noches LKX Software,

     

    Has probado a añadir la referencia con el asistente para añadir Services References?, aunque no lo ponga por ningún sitio si es compatible con los .asmx, pero ten en cuenta lo que dice Josue Yeray, todos los métodos que te creará son asincronos, pero una vez hayas instanciado una variable con el nuevo servicio web, es tan sencillo como llamar de la siguiente forma a los métodos:

    Mi servicio web se llama smuse, lo inicializo así dentro de la clase mysmuseaccesshelper, es una clase para facilitarme la conección

     

     public smuse.BasicSoapClient wssmuse { 
          get{       
            if (mvarsmuse == null) {
              mvarsmuse = new smuse.BasicSoapClient();
              
            }
            return mvarsmuse;
          }
        }
    

     

    y luego accedo a los métodos de la siguiente manera, con mysmuseclass que es una instancia de mysmuseaccesshelper:

     

    mysmuseclass.wssmuse.Devuelve_UsuarioByUserNameCompleted += new EventHandler<smuse.Devuelve_UsuarioByUserNameCompletedEventArgs>(wssmuse_Devuelve_UsuarioByUserNameCompleted);
    
    mysmuseclass.wssmuse.Devuelve_UsuarioByUserNameAsync(mysmuseclass.sessionid, "ciani");
    

     

    Y en el evento completed recoges lo que te devuelva el método, a mi me funciona perfectamente.

     

    Espero te sirva de ayuda.

     

    martes, 26 de abril de 2011 21:17
  • Hola Ciani,

    En mi caso el servicio web es un servicio en PHP, y utilizo el asistente para Agregar referencias de servicios como ya comente en un comentario de los del principio. Acceder a un servicio Web estandar en el que paso un parametro por url tal como ....&codigo=28001 no tengo problema y me funciona, el problema ocurre cuando al servicio web que deseo acceder no utiliza parametros, sino que se debe pasar contenido en la llamada al metodo y ese contenido es todo un xml con infinidad de informacion, ya que el servicio espera ese XML y otro parametro que indica el subproceso que se debe ejecutar dentro de ese metodo.

     

    En el primer caso que me funciona seria mas o menos este trozo de codigo:

     

    Dim fullUri As New UriBuilder(URLGeo)

    fullUri.Query ="postalcode=" + Cpostal + "&country=ES&maxRows=50"

    ' initialize a new WebRequest

    Dim forecastRequest As HttpWebRequest = CType(WebRequest.Create(fullUri.Uri), HttpWebRequest)

    En el caso de lo que no me funciona puedes mirar todo el trozo de codigo mas arriba. Las diferencias son claras ya que en el que funciona se utiliza el parametro "Query" de las uriBuilder, cosa que en el caso que no consigo hacer funcionar, no se puede utilizar al ser via Post y no via Get.

    Gracias, pero sigo intentando resolverlo...

    martes, 26 de abril de 2011 22:54
  • Hola Josue,

     

    Me preguntaste por tener acceso al servicio, y te pase datos para que pudieras comprobar lo que te comente, pero no me dijiste si al final lo probaste o no, me seria de gran ayuda, pues me esta bloqueando el proyecto de traspaso de WM6 a WP7 y en caso de no poder solucionarlo pronto, nos veremos forzados a utilizar los recursos en pasar el proyecto a la plataforma de Android, cosa que quisieramos resistirnos hasta que nos veamos obligados.

    Saludos.

    martes, 26 de abril de 2011 23:06
  • Vicente,

    marcaste este comentario como respuesta, pero no he conseguido de ninguna de las maneras hacerlo funcionar, de hecho revisamos todo, te adjunte el codigo, analizamos las excepciones y no encontramos nada. Me gustaria si es posible hacerte llegar el codigo ya que es muy simple y no tiene ninguna logica que un servicio conecte y responda y con otro la respuesta siempre de error, siendo uno un servicio web externo a nosotros y el otro uno desarrollado por nosotros y operativo con WM6 sin problemas.

    Gracias.

    miércoles, 13 de julio de 2011 22:11
  • Hola!

    Perdon, fui yo el que lo marcó como respuesta, me parecio el más acertado y estuvistes mucho tiempo sin responder, por eso lo marque, pensé que estaba resuelto.

    Si quieres enviame el codigo e instrucciones a josueyeray[arroba]gmail[punto]com y lo miro a ver si se que pasa.

    Un saludo!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    jueves, 14 de julio de 2011 6:24
    Moderador
  • Hola Josue y Lkx Software:
    He estado revisando el hilo y lo he probado agregando una referencia a servicios en esta url
    http://lkxsoftware.es/webservice2/mobiletoservice0.php?wsdl 
    Y funciona correctamente excepto una cosa que depende del servidor y que te va a obligar a realizar unos cambios a nivel de los servicios php. Este encoding "ISO-8859-1" no lo soporta WP7 en llamadas a servicio.
    para comprobarlo cambia en el archivo ServiceReferences.ClientConfig el binding y lo dejas de la siguiente forma:
    <basicHttpBinding>
                    <binding name="LKXSoftwareBinding" maxBufferSize="2147483647"
                        maxReceivedMessageSize="2147483647" textEncoding="iso-8859-1">                                    
                        <security mode="None" />
                    </binding>
                </basicHttpBinding>
    Tendrías que cambiar a "utf-8". 
    Bueno voy a ver si soy capaz de explicarme y no hay que enviar código. Cuando se crea una referencia web en wp7, Visual estudio crea una clase en tu caso "LKXSoftwarePortType", esa clase ya implementa todos los mecanismos necesarios para realizar llamadas asincronas con lo cual lo mejor es que nos olvidemos de los metodos  "BegingetAllianz2 y EndgetAllianz2" que  ademas no pertenecen a la clase "LKXSoftwarePortType" sino a otra clase "LKXSoftwarePortTypeClientChannel" que es una clase privada de "LKXSoftwarePortType". Lo que tenemos que hacer es lo siguiente:
    Llamada al servicio:
    string Xml = @"<?xml version='1.0' encoding='utf-8'?>
                <RDataVehiclesRequest>
                <Manufacturer></Manufacturer>
                <Group></Group>
                <Model></Model>
                </RDataVehiclesRequest>";
                LKXSoftwarePortTypeClient cl = new LKXSoftwarePortTypeClient();           
                cl.getAllianz2Completed += new EventHandler<getAllianz2CompletedEventArgs>(cl_getAllianz2Completed);
                cl.getAllianz2Async("TarificaAutos", Xml);
    Fijate que le he cambiado el encoding a "utf-8"
    En el metodo cl_getAllianz2Completed recibiras la respuesta al servicio y la podras capturar de la siguiente forma:
    void cl_getAllianz2Completed(object sender, getAllianz2CompletedEventArgs e)
            {
                string Resultado = e.Result;
            }
    Insisto este código no funciona en WP7 y si por ejemplo en windows form  por el encoding. El servicio cuando se llama
    devuelve lo siguiente:
    <?xml version="1.0" encoding="ISO-8859-1"?><INCIDENCIAS><incidencia id="1"><codigo>W1</codigo><detalle>WS_Tarificador execute Error: null</detalle></incidencia></INCIDENCIAS>
    Respecto al tema de guardar el archivo sigue las indicaciones de Vicente Cartas.
    Saludos

    phurtado
    jueves, 14 de julio de 2011 8:39
  • Hola Josue y Lkx Software:
    He estado revisando el hilo y lo he probado agregando una referencia a servicios en esta url
    http://lkxsoftware.es/webservice2/mobiletoservice0.php?wsdl 
    Y funciona correctamente excepto una cosa que depende del servidor y que te va a obligar a realizar unos cambios a nivel de los servicios php. Este encoding "ISO-8859-1" no lo soporta WP7 en llamadas a servicio.
    para comprobarlo cambia en el archivo ServiceReferences.ClientConfig el binding y lo dejas de la siguiente forma:
    <basicHttpBinding>
                    <binding name="LKXSoftwareBinding" maxBufferSize="2147483647"
                        maxReceivedMessageSize="2147483647" textEncoding="iso-8859-1">                                    
                        <security mode="None" />
                    </binding>
                </basicHttpBinding>
    Tendrías que cambiar a "utf-8". 
    Bueno voy a ver si soy capaz de explicarme y no hay que enviar código. Cuando se crea una referencia web en wp7, Visual estudio crea una clase en tu caso "LKXSoftwarePortType", esa clase ya implementa todos los mecanismos necesarios para realizar llamadas asincronas con lo cual lo mejor es que nos olvidemos de los metodos  "BegingetAllianz2 y EndgetAllianz2" que  ademas no pertenecen a la clase "LKXSoftwarePortType" sino a otra clase "LKXSoftwarePortTypeClientChannel" que es una clase privada de "LKXSoftwarePortType". Lo que tenemos que hacer es lo siguiente:
    Llamada al servicio:
    string Xml = @"<?xml version='1.0' encoding='utf-8'?>
                <RDataVehiclesRequest>
                <Manufacturer></Manufacturer>
                <Group></Group>
                <Model></Model>
                </RDataVehiclesRequest>";
                LKXSoftwarePortTypeClient cl = new LKXSoftwarePortTypeClient();           
                cl.getAllianz2Completed += new EventHandler<getAllianz2CompletedEventArgs>(cl_getAllianz2Completed);
                cl.getAllianz2Async("TarificaAutos", Xml);
    Fijate que le he cambiado el encoding a "utf-8"
    En el metodo cl_getAllianz2Completed recibiras la respuesta al servicio y la podras capturar de la siguiente forma:
    void cl_getAllianz2Completed(object sender, getAllianz2CompletedEventArgs e)
            {
                string Resultado = e.Result;
            }
    Insisto este código no funciona en WP7 y si por ejemplo en windows form  por el encoding. El servicio cuando se llama
    devuelve lo siguiente:
    <?xml version="1.0" encoding="ISO-8859-1"?><INCIDENCIAS><incidencia id="1"><codigo>W1</codigo><detalle>WS_Tarificador execute Error: null</detalle></incidencia></INCIDENCIAS>
    Respecto al tema de guardar el archivo sigue las indicaciones de Vicente Cartas.
    Saludos

    phurtado


    Hola Pedro,

     

    Gracias por los matices, pero solo una cosa no me acab de funcionar, he convertido tu trozo de codigo a VB, y poniendo lo siguiente:

    Dim cl As New WLKXSoftwarePortTypeClient()

    cl.getAllianz2Completed += New EventHandler(Of getAllianz2CompletedEventArgs)(AddressOf cl_getAllianz2Completed)

    cl.getAllianz2Async("TarificaAutos", MainPage.XML)

    pero en la segunda linea de codigo, me aparece el error: Error 2 'getAllianz2Completed' no es un miembro de 'Pocket_Segur_7.LKXSoftwarePortTypeClient'. 

    viernes, 15 de julio de 2011 15:33
  • Hola:

    Lo que te indica el error de compilación es que el evento getAllianz2Completed no esta definido en la clase WLKXSoftwarePortTypeClient. Puede ser por las herramientas de generación de código de Vb. Yo he creado un proyecto vb y he creado una referencia a servicio desde la url 

    http://lkxsoftware.es/webservice2/mobiletoservice0.php?wsdl   y efectivamente no crea ninguno de los metodos  para realizar llamadas

    asincronas. No existen los eventos getAllianz2Completed ni el metodo getAllianz2Async, la verdad es que no se por lo que es, no trabajo en vb 

    desde hace años. Pero se me ocurre una solucion rapida.

     

    Crea un proyecto de clases en c# agrega la referencia al servicio,compila y en tu proyecto agrega la referencia a ese nuevo proyecto. Después podrás trabajar desde el proyecto vb con la clase que se ha generado en c# sin problemas. Lo único que tienes que tener en cuenta es que el archivo config que te genere debes de pasarlo al proyecto vb.

     

    Aun así piensa que si trabajas desde wp7 tendras problemas con iso-8859-1, en llamadas a servicio.

     

    Saludos.


    phurtado
    viernes, 15 de julio de 2011 16:33
  • Hola:

    Lo que te indica el error de compilación es que el evento getAllianz2Completed no esta definido en la clase WLKXSoftwarePortTypeClient. Puede ser por las herramientas de generación de código de Vb. Yo he creado un proyecto vb y he creado una referencia a servicio desde la url 

    http://lkxsoftware.es/webservice2/mobiletoservice0.php?wsdl   y efectivamente no crea ninguno de los metodos  para realizar llamadas

    asincronas. No existen los eventos getAllianz2Completed ni el metodo getAllianz2Async, la verdad es que no se por lo que es, no trabajo en vb 

    desde hace años. Pero se me ocurre una solucion rapida.

     

    Crea un proyecto de clases en c# agrega la referencia al servicio,compila y en tu proyecto agrega la referencia a ese nuevo proyecto. Después podrás trabajar desde el proyecto vb con la clase que se ha generado en c# sin problemas. Lo único que tienes que tener en cuenta es que el archivo config que te genere debes de pasarlo al proyecto vb.

     

    Aun así piensa que si trabajas desde wp7 tendras problemas con iso-8859-1, en llamadas a servicio.

     

    Saludos.


    phurtado


    Hola Pedro,

     

    interrumpiendo la ejecucion en la funcion EndgetAllianz2 del reference.vb, puedo observar lo que me comentas del iso-8859-1, señal de que ya recibo respuesta del servidor, pero observando en el reference.vb he podido observar que dentro del "Partial Public Class LKXSoftwarePortTypeClient" existe esta linea que define el getallianz2completed, pero no entiendo por que no aparece "Public Event getAllianz2Completed As System.EventHandler(Of getAllianz2CompletedEventArgs)"

    De todas formas, como puedo entonces interceptar la respuesta que aparece en el EndgetAllianz2 para poder analizarla?

    Otra cosa, la respuesta me viene desde un servicio Web externo al mio ya con el formato iso-8859-1, sabes si puedo yo desde mi servicio PHP convertirlo a utf8 de forma sencilla?

    Ya le voy viendo la luz al proyecto y me estoy animando a no dejarlo y pasarme a Android, jajaja

    Bueno, si me puedes dar alguna pista te pongo el codigo como me ha quedado definitivamente:

    'LKXSoftwarePortTypeClient cl = new LKXSoftwarePortTypeClient();

    'cl.getAllianz2Completed += new EventHandler<getAllianz2CompletedEventArgs>(cl_getAllianz2Completed);

    'cl.getAllianz2Async("TarificaAutos", Xml);

    Dim cl As New WS_LKXSoftware.LKXSoftwarePortTypeClient()

    'cl.getAllianz2Completed += New EventHandler(Of getAllianz2CompletedEventArgs)(AddressOf cl_getAllianz2Completed)

    Try

        cl.getAllianz2Async("MarcaModelo", MainPage.XMLMarca)

        'MainPage.WS_LKX.BegingetAllianz2("TarificaAutos", XML_Marca, CallbackLKX, StateLKX)

    Catch ex As Exception

        MessageBox.Show(ex.ToString)

    End Try

    Al final es simple, pero al no tener un Evento que capture la respuesta y me la deje en una variable, pues tampoco puedo adelantar mas.    GRACIAS

    martes, 19 de julio de 2011 16:32
  • Hola:

     

    Si te pasas a Android, después del tiempo que llevo con esto te prometo que te localizo y te quito las ganas, ten en cuenta que cuando vi lo de Android me mordí la lengua de lo lindo :)

     

    1.pero no entiendo por que no aparece "Public Event getAllianz2CompletedAs System.EventHandler(Of getAllianz2CompletedEventArgs)". 

    Yo hiice pruebas con Vb y te repito que no soy experto en Vb y vi que la herramienta de generación VB de Visual Studio para ese servició no generaba ningún evento. Porque no lo se, hace años que abandone Vb y me cuesta. De hecho yo lo probe en una aplicación no Wp7, por si era un error de Wp7 y tampoco lo genera. ¿Por que no aplicas lo que te comente crea el servicio en un dll de c# y despues lo consumes desde Vb. Para ti va a ser transparente.

    2.De todas formas, como puedo entonces interceptar la respuesta que aparece en el EndgetAllianz2 para poder analizarla?

     

    Si te refierres con eso a poner un punto de interrupción en ese metodo, mira tu clase LKXSoftwarePortTypeClient y si la tienes decorada con el atributo 

     

    Global.System.Diagnostics.DebuggerNonUserCodeAttribute()

     

    Comentalo, creo que en vb era 'Global.System.Diagnostics.DebuggerNonUserCodeAttribute() :)

     

    3. Respecto a lo de php no te puedo ayudar, no se , eso te pasa por estar en el lado oscuro de la ciencia :). Haz una burrada cambia  a lo burro con replace "iso-8859-1, por utf-8 y haber si hay suerte. Te repito esto es una burrada. Pásate al lado bueno de la ciencia y créalo en wcf.

     

    Saludos.


    phurtado
    martes, 19 de julio de 2011 17:28
  • Hola:

     

    Lo de Android fue un punto de desesperacion, pero soy consciente de la gran cantidad de agujeros de seguridad que tiene y hace que no sea una opcion.

    1. El public event aparece y de hecho el getAllianz2Async que a Ti no te aparecio al anexar el servicio, a mi si que me aparece, incluso he creado un proyecto en C# agrego el servicio, reviso el reference.cs y esta igual al reference.vb, en ambos aparecen los mismos Eventos y public Event. De todas formas, lo que he hecho ha sido, crear un proyecto en C# (cosa nueva para mi) del tipo Windows Phone Class Library, Agrego una Referencia de Servicio desde la url del Servicio Web, y en Generar pulso Gerenar Solucion. Lo que no se si el proyecto creado ha sido del tipo correcto pues por lo que dices deberia haber creado un proyecto de Biblioteca de Classes, El problema es que utilizo el Visual Studio 2010 Ultimate y de Windows Phone 7 solo me aparecen proyectos de Phone Game y Phone Game Library, mientras qu si utilizo la version Visual Studio 2010 Express for Windows Phone me aparecen una infinidad de diferentes tipos de proyectos Windows Phone 7, y es desde esta desde la que cree el proyecto para luego trabajarlo desde la version ultimate.

    2. Lo que quiero es poder acceder a la respuesta del servicio, mediante interrupcion he observado que en EndgetAllianz2, dispongo de la respuesta, pero no se como poderla utilizar desde el codigo del xaml.vb de la pantalla que lanza la conexion mediante el codigo que te he adjuntado en el anterior comentario.

    3. El mismo servicio lo disponia en ASP.NET, pero debido a ciertas necesidades del cliente tuve que crearles el mismo Servicio Web en php. La verdad es que a mi me daba lo mismo en PHP que en .NET, pero los clientes marcan las pautas. De todas formas, he visto ya en php.net como utilizar uan funcion utf8encode o la utf8decode, aunque no me dan mucha fiabilidad ya que el problema estara con los caracteres no estandares y a saber que pasa con acentos, y caracteres complementarios, y mas cuando en uno de los servicios devuelve mediante tecnologia MTOM ficheros en Base64.

    Muchas gracias por la ayuda, y si me has de buscar, te adelanto que estoy en Barcelona.

    Saludos.

     

    martes, 19 de julio de 2011 20:35
  • Hola:

     

    Te aclaro :

     

    1. Fue un error mio no pulsar en la ventana de Agregar Referencia de Servicio-> Avanzadas->Agegar Referencia Web. Perdón.

    2. Me estas haciendo volver al año 1998 :).

         2.1 define una variable a nivel de clase tal como.

                   Vb  Private WithEvents clase As LKXSoftwarePortTypeClient = New LKXSoftwarePortTypeClient()

                   c# LKXSoftwarePortTypeClient clase = new LKXSoftwarePortTypeClient();

         2.2.

                 Si pulsas en el primer combo que aparece en editor y seleccionas clase te aparecen los eventos.

         2.3 Selecciona getAllianz2Completed y te escribe lo siguiente:

                 Vb  

                       

    Private Sub clase_getAllianz2Completed(sender As Object, e As es.lkxsoftware.getAllianz2CompletedEventArgs) Handles clase.getAllianz2Completed
    
          <strong> //Escribe aquí lo que quieras</strong>
    
      End Sub
    

     

               c#

          Aparecio el evento,  que apunta al metodo clase_getAllianz2Completed aquí es donde llegaran los datos. e.Result :)

     

     

       Lo que me ha costado el Vb. acuerdate de "Private WithEvents clase As LKXSoftwarePortTypeClient = New LKXSoftwarePortTypeClient()". Al declarar con WithEvents puedes acceder a los eventos de la clase. Olvidate de EndgetAllianz2 el secreto esta en WithEvents .

         3. En el punto 3 que tengas suerte. Php no voy a estudiar para responderte :)

     

         Si voy a Barcelona no te preocupes que tomamos un café (yo no soy agresivo). Lo pagas tu y Hablamos de c# y wp7, no de Vb,php y Android.

     

        Creo que hemos terminado :)

    Saludos.


    phurtado
    martes, 19 de julio de 2011 21:41