How to return JSON from a 2.0 asmx web service

69,235

Solution 1

It's no problem to return JSON from ASMX services in ASP.NET 2.0. You just need the ASP.NET AJAX Extensions installed.

Do be sure to add the [ScriptService] decoration to your web service. That's what instructs the server side portion of the ASP.NET AJAX framework to return JSON for a properly formed request.

Also, you'll need to drop the ".d" from "msg.d" in my example, if you're using it with 2.0. The ".d" is a security feature that came with 3.5.

Solution 2

The response is wrapped in a element because you're method says it will return a string. You could use this to be able to send plain json, but your wsdl will be fooled (the function is void but does respond data).

[WebMethod(Description="return pure JSON")]
public void retrieveByIdToPureJSON( int id )
{
  Context.Response.Write( JsonConvert.SerializeObject( mydbtable.getById(id) );
}

Good luck, tom

Btw: see Newtonsoft.Json for JsonConvert

Solution 3

You need to decorate your web method with the following:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

You've got the rest right :)

More info at Encosia and Andrew Roland's Blog

EDIT: As noted below this is .NET 3.5 only (I was unaware of this, my bad).

Solution 4

You probably can't do anything other than XML or binary serialization in .NET 2.0. If you're not using an autogenerated web reference then don't bother with ASMX. Just use an ASPX or ASHX instead.

Solution 5

You can use the Jayrock library Quick start for asp.net

This allows you to write a http handler to return you json.

<%@ WebHandler Class="JayrockWeb.HelloWorld" %>

namespace JayrockWeb
{
    using System;
    using System.Web;
    using Jayrock.Json;
    using Jayrock.JsonRpc;
    using Jayrock.JsonRpc.Web;

    public class HelloWorld : JsonRpcHandler
    {
        [ JsonRpcMethod("greetings") ]
        public string Greetings()
        {
            return "Welcome to Jayrock!";
        }
    }
}
Share:
69,235
camainc
Author by

camainc

My day job: I am a senior-level .Net Developer, a mentor, and a part-time programming instructor. My passion: I'm the Co-Founder and Director of Myanmar Hope Christian Mission, Inc., an international non-profit dedicated to helping the tribal people of northwest Myanmar rise out of poverty. My hobbies: Watercolor painting and reading.

Updated on July 27, 2022

Comments

  • camainc
    camainc almost 2 years

    I am using .Net framework 2.0 / jQuery to make an Ajax call to a 2.0 web service. No matter what I set the contentType to in the ajax call, the service always returns XML. I want it to return Json!

    Here is the call:

          $(document).ready(function() {
             $.ajax({
                type: "POST",
                url: "DonationsService.asmx/GetDate",
                data: "{}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(msg) {
                  // Hide the fake progress indicator graphic.
                  $('#RSSContent').removeClass('loading');
    
                  // Insert the returned HTML into the <div>.
                  $('#RSSContent').html(msg.d);
                }
              });
            });    
    

    Here is what the request header looks like in Fiddler:

    POST /DonationsService.asmx/GetDate HTTP/1.1
    x-requested-with: XMLHttpRequest
    Accept-Language: en-us
    Referer: http://localhost:1238/text.htm
    Accept: application/json, text/javascript, */*
    Content-Type: application/json; charset=utf-8
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; eMusic DLM/4; .NET CLR 2.0.50727)
    Host: localhost:1238
    Content-Length: 2
    Connection: Keep-Alive
    Pragma: no-cache
    

    I have tried setting the contentType to 'text/json' and get the same results.

    Here is the web service method:

    <WebMethod()> _
    Public Function GetDate() As String
    
        'just playing around with Newtonsoft.Json
        Dim sb As New StringBuilder
        Dim sw As New IO.StringWriter(sb)
        Dim strOut As String = String.Empty
    
        Using jw As New JsonTextWriter(sw)
            With jw
                .WriteStartObject()
                .WritePropertyName("DateTime")
                .WriteValue(DateTime.Now.ToString)
                .WriteEndObject()
            End With
            strOut = sw.ToString
        End Using
    
        Return strOut
    
    End Function
    

    and here is what it returns:

    <?xml version="1.0" encoding="utf-8"?>
    <string xmlns="http://DMS.Webservices.org/">{"DateTime":"11/13/2008 6:04:22 PM"}</string>
    

    Does anyone know how to force the web service to return Json when I ask for Json?

    Please don't tell me to upgrade to .Net Framework 3.5 or anything like that (I'm not that stupid). I need a 2.0 solution.