none
WEBSERVICE Y JSON devuelve con {"d": RRS feed

  • Pregunta

  • Buenas

    Tengo un problema al obternet el json de un webservice (.asmx)

    este es mi Servicio Web desde un WebService1.asmx 

     <WebMethod(Description:="", MessageName:="")>
        <ScriptMethod(ResponseFormat:=ResponseFormat.Json, UseHttpGet:=False, XmlSerializeString:=False)>
        Public Function buscasentenciaweb(user As String, password As String) As String
            json = "{""user"":""test""," + """password"":""bla""}"
            Return json
        End Function

    Retorna: {"user":"test","password":"bla"}

    Y llamo al servicio desde una aplicación Windows Form así.

     Private Sub SimpleButton1_Click(sender As Object, e As EventArgs) Handles SimpleButton1.Click
            Dim httpWebRequest = DirectCast(WebRequest.Create("http://localhost:64582/WebService1.asmx/buscasentenciaweb"), HttpWebRequest)
            Dim json As String = "{""user"":""test""," + """password"":""bla""}"
            httpWebRequest.ContentType = "application/json; charset=utf-8"
            httpWebRequest.Accept = "json"
            httpWebRequest.Method = "POST"
            httpWebRequest.ContentLength = json.Length
            Using streamWriter = New StreamWriter(httpWebRequest.GetRequestStream())
                streamWriter.Write(json)
                streamWriter.Flush()
                streamWriter.Close()
            End Using
            Dim responsefromserver As String
            Dim httpResponse = DirectCast(httpWebRequest.GetResponse(), HttpWebResponse)
            Using streamReader = New StreamReader(httpResponse.GetResponseStream())
                responsefromserver = streamReader.ReadToEnd()
            End Using
            MsgBox(responsefromserver)
        End Sub

    y me devuelve: {"d":"{\"user\":\"test\",\"password\":\"bla\"}"}

    No se por que le agrega "d":" y los \

    Ayuda por favor ......  AYÚDENME POR FAVOR VOY DÍAS BUSCANDO Y NO ENCUENTRO LA SOLUCIÓN,

    quisiera que me devuelva el json como es así: {"user":"test","password":"bla"}

    y no así: {"d":"{\"user\":\"test\",\"password\":\"bla\"}"}

    tb les dejo el webconfig del servicio.

    <?xml version="1.0" encoding="utf-8"?>
    <!--
      Para obtener más información sobre cómo configurar la aplicación de ASP.NET, visite
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
    <configuration>
      
      <system.web>
      
        <compilation debug="true" strict="false" explicit="true" targetFramework="4.5.2"/>
        <httpRuntime targetFramework="4.5.2"/>
      </system.web>
      <system.codedom>
        <compilers>
          <compiler language="c#;cs;csharp" extension=".cs"
            type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
          <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
            type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
        </compilers>
      </system.codedom>
    </configuration>
    Gracias de antemano.

    viernes, 3 de febrero de 2017 7:13

Respuestas

  • cual de estas 3 opciones me recomiendas para lograr un mejor performance

    Es difícil de decir cuál tendrá mejor performance. Puesto que el datatable en todos los casos lo vas a obtener de la misma manera, y los datos que vas a devolver son los mismos, al final la diferencia estará en cuál de los serializadores JSON sea el más eficiente. Si realmente el rendimiento es crítico, sugiero buscar por la red alguna comparativa de serializadores, y quedarse con el que sea más veloz a la vez que compatible con el DataTable. Y claro, habrá que meterlo dentro del .ashx porque las opciones que usan el WebMethod no te dejan elegir el serializador. En cualquier caso el .ashx en sí mismo es sumamente eficiente, así que todas las limitaciones que encuentres en cuanto a rendimiento vendrán dadas por el coste de generar el DataTable y el de ejecutar el serializador que hayas elegido.

    viernes, 3 de febrero de 2017 22:12

Todas las respuestas

  • Estás haciendo una función que devuelve un string, y luego pidiéndole que el string te lo encapsule como JSON. Por eso recibes un objeto que contiene un string y el string dentro tiene la cadena que le pusiste originalmente, que casualmente resulta ser a su vez un JSON, pero eso el WebService no lo sabe.

    Si quieres, prueba así:

    <WebMethod(Description:="", MessageName:="")>
    <ScriptMethod(ResponseFormat:=ResponseFormat.Json, UseHttpGet:=False, XmlSerializeString:=False)>
    Public Function buscasentenciaweb(user As String, password As String) As Resultado
        Dim r as Resultado
        r.user="test"
        r.password="bla"
        Return r
    End Function
    
    Public Class Resultado
        Public Property user As String
        Public Property Name As String
    End Class


    viernes, 3 de febrero de 2017 7:30
  • Es que lo que quisiera devolver es una datatable (que cambia de columnas, según alguna sentencia ) como tendría que hacerlo?

              If cnn.State = ConnectionState.Closed Then
                    cnn.Open()
                End If
    
                Using cmd As New MySqlCommand("sentenciasql")
                    cmd.Connection = cnn
                    cmd.CommandType = CommandType.StoredProcedure
                    cmd.Parameters.Add(New MySqlParameter("@sentencia", sensql))
                    Dim dt As New System.Data.DataTable()
                    Using sda As New MySqlDataAdapter(cmd)
                        sda.Fill(dt)
                    End Using
                    Dim json = JsonConvert.SerializeObject(dt, New Newtonsoft.Json.Converters.DataTableConverter)
                    Return json
    
                End Using

    viernes, 3 de febrero de 2017 7:37
  • Bien, en este caso y tal como lo tienes, ya estas ensamblando tu mismo el resultado generando el JSON dentro de un String. Por lo tanto, no quieres llamar a un WebMethod que codifique su respuesta como JSON, sino que quieres llamar a un simple metodo que devuelva un string (donde el string ya lo cargaste previamente con JSON). Esto puedes conseguirlo muy facilmente con un simple .ashx que devuelva el string con context.Response.Write(json). No se necesita el WebMethod.

    Otra opcion es declarar un WebMethod que devuelva un DataTable, y llamarlo pidiendo que devuelva JSON. En ese caso no meterias dentro de tu codigo la instruccion JsonConvert.SerializeObject, sino que directamente harias "return ds" y el propio WebMethod serializaria el ds para convertirlo en JSON.

    viernes, 3 de febrero de 2017 11:39
  • y Cual crees que seria el mejor método?

    Hacer un .ashx o q devuelva el dt?

    también podría hacer esto

    <WebMethod(Description:="", MessageName:="")>
    <ScriptMethod(ResponseFormat:=ResponseFormat.Json, UseHttpGet:=False, XmlSerializeString:=False)>
    Public Function buscasentenciaweb(user As String, password As String) As Resultado
        Dim r as Resultado
        r.dt= JsonConvert.SerializeObject(dt, New Newtonsoft.Json.Converters.DataTableConverter)
        Return r
    End Function
    
    Public Class Resultado
        Public Property dt As String
    End Class

    y en el lado del cliente ya los deserializo y obtengo el string q en verdad es el JSON compleo de la DT.

    Estimado Alberto cual de estas 3 opciones me recomiendas para lograr un mejor performance, debemos tomar en cuenta q el datatable puede ser muy grande.

    Muchas gracias.


    viernes, 3 de febrero de 2017 16:52
  • cual de estas 3 opciones me recomiendas para lograr un mejor performance

    Es difícil de decir cuál tendrá mejor performance. Puesto que el datatable en todos los casos lo vas a obtener de la misma manera, y los datos que vas a devolver son los mismos, al final la diferencia estará en cuál de los serializadores JSON sea el más eficiente. Si realmente el rendimiento es crítico, sugiero buscar por la red alguna comparativa de serializadores, y quedarse con el que sea más veloz a la vez que compatible con el DataTable. Y claro, habrá que meterlo dentro del .ashx porque las opciones que usan el WebMethod no te dejan elegir el serializador. En cualquier caso el .ashx en sí mismo es sumamente eficiente, así que todas las limitaciones que encuentres en cuanto a rendimiento vendrán dadas por el coste de generar el DataTable y el de ejecutar el serializador que hayas elegido.

    viernes, 3 de febrero de 2017 22:12