O ASP.NET Webservice é uma excelente solução para se criar comunicação entre sistemas de diferentes plataformas. Com ele torna-se possível enviar e receber dados utilizando uma linguagem universal, o XML.
Porém o XML vem sendo aos poucos substituído pelo JSON (JavaScript Object Notation), que é um novo formato para realizarmos intercâmbio de dados. Ele tem a mesma função que o XML, porém vem com a proposta de ser mais leve que seu predecessor. Para quem quiser mais detalhes, ao final do post possui links com algum material.
Importante já adiantar que para execução deste projeto foi utilizado o Json.NET (por James Newton-King). Seus binários e fontes podem ser baixados no CodePlex.

Criando um ASP.NET Webservice

Primeiramente vamos criar um projeto de website (File => New WebSite), em seguida adicionamos um novo ítem de webservice (Figura 01).
Inserindo um item de WebService

Figura 01 – Inserindo um item de WebService

Após termos nosso webservice, vamos desde já inserir como referência o binário do Json.NET (Newtonsoft.Json.dll) e adicionarmos os namespaces abaixo:
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;
Como nosso webservice será consumido como um AJAX pela aplicação Windows Phone que irei construir, e para deixa-lo pré-disposto a ser consumido por qualquer outra fonte, vamos definir nossa classe como um ScriptService, assim permitiremos que nossa classe poderá ser invocada por qualquer script:
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
    [System.Web.Script.Services.ScriptService]
    public class json_ws : System.Web.Services.WebService

Definindo JSON

Legal! Agora que nossa classe está pronta para ser o webservice que precisamos, vamos agora criar um método simples que irá retornar um JSON a partir de um DataTable. Para que isso aconteça como esperamos, temos que definir que o método abaixo terá um ResponseFormat do tipo Json. Isso é bem simples de fazer como mostrado abaixo:
     [WebMethod(Description = "Get world hour.", CacheDuration = 10)]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string GetHourUTC(int TimeZone) {
       
        DataTable dtHour = new DataTable("HourUTC");
        dtHour.Columns.Add(new DataColumn("TimeZone", typeof(int)));
        dtHour.Columns.Add(new DataColumn("Date", typeof(string)));
        dtHour.Columns.Add(new DataColumn("Hour", typeof(string)));
       
        DataRow drHour = dtHour.NewRow();
        drHour["TimeZone"] = 0;
        drHour["Date"] = DateTime.UtcNow.ToString("yyyy-MM-dd");
        drHour["Hour"] = DateTime.UtcNow.ToString("HH:mm:ss");
        dtHour.Rows.Add(drHour);
        drHour = dtHour.NewRow();
        drHour["TimeZone"] = TimeZone;
        drHour["Date"] = DateTime.UtcNow.AddHours(TimeZone).ToString("yyyy-MM-dd");
        drHour["Hour"] = DateTime.UtcNow.AddHours(TimeZone).ToString("HH:mm:ss");
        dtHour.Rows.Add(drHour);
        return Serialize(dtHour);
    }

Aplicando Json.NET

Nosso método GetHourUTC irá retornar a hora zulu (GMT) atual, e também a hora de onde se parametrizou no TimeZone (lembrando que o TimeZone do Brasil é -3 horas, para horário de Brasília). Reparem que ao final do método estamos chamado um outro método Serialize. Este está logo abaixo e é onde iremos transformar um DataTable (ou mesmo um DataSet) em uma string de estrutura tipo JSON.
   private string Serialize(object value)
    {
        Type type = value.GetType();
        Newtonsoft.Json.JsonSerializer json = new Newtonsoft.Json.JsonSerializer();
        json.NullValueHandling = NullValueHandling.Ignore;
        json.ObjectCreationHandling = ObjectCreationHandling.Replace;
        json.MissingMemberHandling = MissingMemberHandling.Ignore;
        json.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        if (type == typeof(DataTable))
            json.Converters.Add(new DataTableConverter());
        else if (type == typeof(DataSet))
            json.Converters.Add(new DataSetConverter());
        StringWriter sw = new StringWriter();
        Newtonsoft.Json.JsonTextWriter writer = new JsonTextWriter(sw);
        writer.Formatting = Formatting.None;
        writer.QuoteChar = '"';
        json.Serialize(writer, value);
        string output = sw.ToString();
        writer.Close();
        sw.Close();
        return output;
    }

Testando o Webservice

 E voilá! Já temos um ASP.NET Webservice retornando um string JSON (a partir de um DataTable) à nossa disposição!
Testando métodos GetHourUTC do webservice

Figura 02 – Testando métodos GetHourUTC do webservice

Retorno
[{"TimeZone":0,"Date":"2012-04-11","Hour":"14:27:19"},{"TimeZone":-3,"Date":"2012-04-11","Hour":"11:27:19"}]

Conclusão

É muito fácil e bacana criar webservices usando plantaforma ASP.NET. E adaptarmos esses recursos para as novidades seguintes acaba sendo uma necessidade imprescindível. A dominação do JSON sobre o XML parece ser inevitável, visto as propostas que ele se pré dispõe. Um formato mais leve, rápido de ser transferido e ser serializável.

Referências


Leave a Reply

Your email address will not be published. Required fields are marked *