Wymuszanie usługi sieciowej ASP.net w celu zwrócenia JSON

Mam usługę sieci Web ASP.net, której używam do aplikacji internetowej, która zwraca dane XML lub JSON do mnie, w zależności od wywołanej funkcji. Jak dotąd działa to dobrze, ale mam problem. Chcę utworzyć link „eksport” na mojej stronie, który pobierze plik JSON. Link jest sformatowany bardzo prosto:

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

Jak można sobie wyobrazić, powinno to wyeksportować element 2. Do tej pory tak dobrze, tak?

Problem polega na tym, że ponieważ nie żądam, aby zaakceptowanym typem treści był JSON, ASP.net absolutnie odmawia wysłania czegokolwiek poza XML, co nie jest odpowiednie dla tej sytuacji. Kod jest zasadniczo następujący:

    [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);
    }

Mimo że określiłem ResponseFormat jako JSON, zawsze odzyskuję XML, chyba że zażądam tej metody przez AJAX (używając 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(){...});

To świetnie, ale AJAX nie da mi okna dialogowego pobierania. Czy jest jakiś sposób, aby zmusić ASP.net do oddania mi JSON, bez względu na to, jak żądane są dane? Wydaje mi się, że brak ręcznego obejścia tego zachowania jest dużym niedopatrzeniem.

SZYBKA ODPOWIEDŹ:

Po pierwsze, pozwólcie, że powiem, że myślę, że odpowiedź womp jest prawdopodobnie lepszym sposobem na długoterminowe (Convert to WCF), ale deostroll doprowadził mnie do odpowiedzi, której będę używać w najbliższej przyszłości. Należy również zauważyć, że wydaje się to działać przede wszystkim dlatego, że chciałem tylko pobrać, może nie działać tak dobrze we wszystkich sytuacjach. W każdym razie oto kod, którego użyłem, aby uzyskać pożądany wynik:

    [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);
    }

Zwróć uwagę na typ zwrotuunieważnić (co oznacza, że ​​twoja WDSL będzie bezużyteczna dla tej funkcji). Zwrócenie czegokolwiek spowoduje zepsucie odpowiedzi, która jest budowana ręcznie.

questionAnswers(3)

yourAnswerToTheQuestion