Question

J'utilise un service Web ASP.net pour une application Web qui me renvoie des données XML ou JSON, en fonction de la fonction que j'appelle. Cela a bien fonctionné jusqu'à présent, mais j'ai rencontré un problème. Je souhaite créer un " export " lien sur ma page qui téléchargera un fichier JSON. Le lien est formaté très simplement:

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

Comme vous pouvez l'imaginer, cela devrait exporter le point 2. Jusqu'ici tout va bien, oui?

Le problème est que, puisque je ne demande pas spécifiquement que le type de contenu accepté soit JSON, ASP.net refuse absolument de renvoyer tout ce qui est à part XML, ce qui ne convient tout simplement pas à cette situation. Le code est essentiellement comme suit:

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

Bien que j’ai spécifié le ResponseFormat comme JSON, je récupère toujours le code XML sauf si je demande cette méthode via AJAX (à l’aide de 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(){...});

C'est bien, mais AJAX ne me donnera pas de dialogue de téléchargement. Existe-t-il un moyen de forcer ASP.net à me rendre JSON, quelle que soit la manière dont les données sont demandées? Il me semblerait que le fait de ne pas avoir de priorité manuelle pour ce comportement est un oubli de la conception.

RÉPONSE RAPIDE:

Tout d’abord, permettez-moi de dire que je pense que la réponse de womp est probablement la meilleure façon d’aller sur le long terme (conversion en WCF), mais deostroll m’a amené à la réponse que je vais utiliser dans un avenir proche. En outre, il convient de noter que cela semble fonctionner principalement parce que je voulais juste un téléchargement, peut ne pas fonctionner aussi bien dans toutes les situations. Dans tous les cas, voici le code que j'ai utilisé pour obtenir le résultat souhaité:

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

Veuillez noter le type de retour de void (ce qui signifie que votre WDSL sera quasiment inutile pour cette fonction). Renvoyer quoi que ce soit va bousiller la réponse qui est construite à la main.

Était-ce utile?

La solution

Voici deux discussions pour votre forum:

http://forums.asp.net/t/1118828.aspx

http://forums.asp.net/p/1054378/2338982 .aspx # 2338982

Je n'ai aucune idée claire. Ils disent de se concentrer sur la définition du type de contenu sur application / json. Je n'avais jamais travaillé avec wcf auparavant, mais je pense que vous pouvez utiliser l'objet Response.

Définissez le type de contenu sur l'objet de réponse. Faites un response.write en passant vos données json sous forme de chaîne, puis faites un response.end.

Autres conseils

Les services Web Asp.net sont des services Web basés sur SOAP. Ils renverront toujours XML. Les bibliothèques Ajax sont arrivées et le contenu de ScriptMethod a été introduit, mais cela ne change pas le concept sous-jacent.

Vous pouvez faire certaines choses.

Les méthodes Web sont à la limite de l’introduction de WCF. Vous pourriez envisager de migrer vos services Web vers WCF , dans lesquels avoir un contrôle beaucoup plus grand sur le format de sortie.

Si vous ne voulez pas faire cela, vous pouvez sérialiser manuellement le résultat de vos appels de service Web en JSON, et le service l'enveloppera dans un en-tête SOAP. Vous devrez alors supprimer les éléments SOAP.

Je pensais que je devrais jeter cela là-dessus, car cela n'avait pas été mentionné auparavant ... Si vous utilisez WebServices avec ASP.NET 3.5, JSON est le format de retour par défaut. Il vient également avec le sérialiseur JSON afin que vous puissiez cesser d'utiliser le JavascriptSerializer.

Cet article sur le blog de Rick Strahl parle fortement de la Vous pouvez effectuer une conversion typée entre les classes côté serveur et les objets JSON du client.

J'ai récemment terminé un projet utilisant ce nouveau contenu JSON dans .NET 3.5 et je suis extrêmement impressionné par les performances. Peut-être que ça vaut le coup d'oeil ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top