Forçando o serviço da web do asp.net a retornar o JSON

Eu tenho um serviço da Web do asp.net que estou usando para um aplicativo da web que retorna um XML ou dados JSON para mim, dependendo da função que eu chamo. Isso tem funcionado bem até agora, mas me deparei com um problema. Eu quero criar um link "exportar" na minha página que irá baixar um arquivo JSON. O link é formatado de forma muito simples:

<a href="mywebserviceaddress/ExportFunc?itemId=2">Export This Item</a>

Como você pode imaginar, isso deve exportar o item 2. Até aí tudo bem, sim?

O problema é que, como não estou solicitando especificamente que o tipo de conteúdo aceito seja JSON, o ASP.net absolutamente se recusa a enviar nada, exceto XML, que não é apropriado para essa situação. O código é essencialmente o seguinte:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public Item ExportItem(int itemId)
    {
        Context.Response.AddHeader("content-disposition", "attachment; filename=export.json"); //Makes it a download

        return GetExportItem(itemId);
    }

Apesar de eu especificar o ResponseFormat como JSON, sempre recebo XML, a menos que eu solicite esse método via AJAX (usando o Google Web Toolkit, BTW):

    RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, "mywebserviceaddress/ExportFunc");
    builder.setHeader("Content-type","application/json; charset=utf-8");
    builder.setHeader("Accepts","application/json");
    builder.sendRequest("{\"itemId\":2}", new RequestCallback(){...});

Isso é ótimo, mas o AJAX não me dará um diálogo de download. Existe alguma maneira de forçar o asp.net para me dar de volta JSON, independentemente de como os dados são solicitados? Parece-me que não ter uma substituição manual para esse comportamento é uma supervisão bruta do design.

RESPOSTA RÁPIDA:

Primeiramente, deixe-me dizer que eu acho que a resposta do womp é provavelmente a melhor maneira de ir a longo prazo (Convert to WCF), mas deostroll me levou à resposta que eu usarei para o futuro imediato. Além disso, deve-se notar que isso parece funcionar principalmente porque eu queria apenas um download, pode não funcionar tão bem em todas as situações. De qualquer forma, aqui está o código que acabei usando para obter o resultado que queria:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public void ExportItem(int itemId)
    {
        Item item = GetExportItem(itemId);            

        JavaScriptSerializer js = new JavaScriptSerializer();
        string str = js.Serialize(item);

        Context.Response.Clear();
        Context.Response.ContentType = "application/json";
        Context.Response.AddHeader("content-disposition", "attachment; filename=export.json");
        Context.Response.AddHeader("content-length", str.Length.ToString());
        Context.Response.Flush();
        Context.Response.Write(str);
    }

Por favor, note o tipo de retornovazio (o que significa que o seu WDSL será quase inútil para essa função). Retornar qualquer coisa vai estragar a resposta que está sendo construída à mão.

questionAnswers(3)

yourAnswerToTheQuestion