2010-11-11 2 views
0

J'ai une application Web ASP.NET.ASP.NET - La réponse d'une méthode Web peut-elle être SOAP (XML) et JSON?

Il dispose d'un service Web, avec plusieurs méthodes Web.

Toutes ces méthodes Web sont basées sur les paramètres par défaut. Par exemple:

using System.Web.Services; 

namespace WebApplication2 
{ 
    [WebService(Namespace = "http://mydomain.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [System.ComponentModel.ToolboxItem(false)] 
    public class WebService1 : WebService 
    { 
     [WebMethod] 
     public string HelloWorld() 
     { 
      return "Hello World"; 
     } 

     [WebMethod] 
     public Person GetPersonById(int id) 
     { 
      Person result = new Person(); 
      // code... 
      return person; 
     } 
    } 
} 

La réponse est au format SOAP (XML).

Ma question: Puis-je modifier le format de la réponse en JSON, en fonction d'un paramètre d'entrée ou d'un en-tête?

+0

Est-ce que vous demandez à _how_ de le faire, ou si vous deviez le faire? – Oded

+0

@Oded - Je demande si c'est techniquement possible, et si oui, comment cela peut-il être fait. La partie "devrait" ne fait pas partie de la portée de cette question, car il existe quelques limitations concernant ce service dans l'environnement de production. –

+0

Ron si l'une des réponses est la réponse s'il vous plaît marquer comme la réponse –

Répondre

0

Le type de réponse d'un service Web ASMX est spécifié par l'attribut ResponseFormat sur la méthode web individuelle.

par exemple:

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Xml)] 
public Person GetPersonById(int id) 

ou

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public Person GetPersonById(int id) 

donc autant que je sache, la réponse est non - vous ne pouvez pas revenir à la fois (d'une méthode qui est).

Je suis sûr qu'il y a des hacks que vous pouvez faire, mais c'est la méthode recommandée.

Si vous souhaitez commencer à renvoyer les deux types, vous devez passer à une approche plus RESTful, avec WCF REST, OData ou ASP.NET MVC.

Dans ces technologies, le callee peut spécifier le type de réponse qu'ils souhaitent:

GET: http://api.yourdomain.com/person/1?format=json

GET: http://api.yourdomain.com/person/1?format=xml

Notez comment les appels sont une ressource physique . Sur une note de côté, vos appels de service Web JSON doivent être HTTP POST, pour des raisons de sécurité mentions par "The Goo" here.

0

Vous devriez vérifier Windows Communication Foundation (WCF). En utilisant cela, vous pouvez définir plusieurs points de terminaison pour un service. Chacun de ces points de terminaison peut, par exemple, renvoyer les données dans un format différent.

REST/SOAP endpoints for a WCF service

+0

Merci pour la référence, je vais essayer de l'implémenter. –

0

Techniquement oui, vous Renvoyez-le JSON et définir le type de contenu de la réponse à "application/json".

+0

Cette technique s'applique-t-elle également au type de retour non-chaîne? (voir la deuxième méthode) –

+0

Lorsque vous renvoyez JSON d'un serveur à un client, il est toujours sous la forme d'une chaîne. Je veux dire que JSON est une représentation sous forme de chaîne d'objets Javascript, c'est-à-dire qu'elle n'est pas binaire. Cependant, la réponse courte est non car, pour la plupart, SOAP est basé sur une "chaîne" et dans votre cas, vos objets Person sont sérialisés en une chaîne, c'est une question de sérialisation en une chaîne JSON. Cela fait un moment que j'ai utilisé WebServices, mais dans un HttpHandler par exemple, si je voulais renvoyer un JSON d'un objet Person, vous pouvez utiliser la classe DataContractJsonSerializer pour faire le travail. –

+0

Notez que SOAP/XML et JSON sont des concepts concurrents de plusieurs façons. Donc, dans votre base, parce que vous utilisez WebServices, vous n'avez pas le choix de renvoyer JSON. –

Questions connexes