2009-07-13 8 views
12

J'ai vu une question similaire mais cela n'a pas résolu mon problème. J'ai un service Web JSON dans un fichier ASMX;Le service Web JSON ASP.NET renvoie toujours la réponse JSON enveloppée dans XML

Le code de la méthode web

 [WebMethod] 
     [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
     public string GetUserRoles(string JSONUserCode) 
     { 
      string retRoles = string.Empty; 
      List<JSONRole> roles = new List<JSONRole>(); 

      {... I Populate the roles here ...} 

      DataContractJsonSerializer serializer = new 
      DataContractJsonSerializer(roles.GetType()); 
      MemoryStream ms = new MemoryStream(); 
      serializer.WriteObject(ms, roles); 
      string jsonString = Encoding.Default.GetString(ms.ToArray()); 
      ms.Close(); 
      return jsonString; 
     } 

Formate correctement la liste correctement, mais enveloppe le rendement entier en XML. Voici la réponse:

<?xml version="1.0" encoding="utf-8" ?> 
    <string xmlns="http://formshare.com/"> 
     [{"Name":"Accounts Payable"},{"Name":"Payroll"}] 
    </string> 

Vous pouvez voir la réponse de votre auto en cliquant sur ce lien:

http://dev.formshare.gologictech.com/JSON/JSONService.asmx/GetUserRoles?JSONUserCode=1234

J'ai besoin que la réponse soit juste:

[{"Name":"Accounts Payable"},{"Name":"Payroll"}] 

Toutes les idées ? Merci de votre aide.

Répondre

11

WebMethod peut fournir les mêmes informations que XML et JSON. Vous devez spécifier le format que vous souhaitez (dataType) dans le client lorsque vous envoyez votre demande.

De même, vous n'êtes pas censé sérialiser manuellement l'objet en JSON, mais plutôt renvoyer les rôles et il sera sérialisé en JSON si votre client demande les données en tant que JSON.

EDIT

exemple jQuery (notez le paramètre dataType):

$.ajax({ 
    type: 'GET', 
    url: 'http://dev.formshare.gologictech.com/JSON/JSONService.asmx/GetUserRoles', 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    data: '{"JSONUserCode":"1234"}', 
    success: myCallback 
}); 

Il convient de mentionner que l'objet ne sera pas retourné exactement le format que vous avez spécifié, mais plutôt, enveloppé dans un objet:

{ d: [ {"Name":"Accounts Payable"}, {"Name":"Payroll"} ] } 

Ceci, cependant, est en fait assez souhaitable, for added security

+0

est-il de toute façon de préciser le type de données dans un POST? – JohnnyCantCode

+0

Je ne suis pas sûr que je suis ... l'exemple ci-dessus est un POST. –

+0

Je suis désolé, je veux dire passer le paramètre dans l'URL comme l'URL que j'ai inclus dans ma question. – JohnnyCantCode

1

Assurez-vous que votre classe de service possède l'attribut [ScriptService]. Cet attribut n'est pas ajouté par défaut.

1

Essayez Jayrock pour .NET, c'est un gestionnaire soigné pour .NET JSON RPC. Cela fera exactement ce dont vous avez besoin. Il y a une procédure étape par étape pour ASP .NET JSON RPC here.

0

Nous avons créé une autre page qui appelle le serveur de service et écrit la réponse (dans notre cas un .aspx). Nous avons nettoyé tout le code HTML, doctype corps de la tête, et fait le code côté serveur pour appeler le service et response.write.

(en cas de ASPX laisser juste la directive de page en haut)

cette façon, vous pouvez obtenir une chaîne propre. Par ailleurs, si cela expose notre application à des menaces de sécurité ou à des performances majeures, j'apprécierais vraiment les commentaires. Juste trop occupé pour le demander ici ou la recherche :)

1

J'ai fait la même erreur en manipulant la sérialisation moi-même. Vous n'êtes pas supposé retourner la chaîne mais l'objet lui-même.

Si vous avez déjà développé une centaine de services comme celui-ci, un travail pour vous: il suffit de créer un aspx, ServiceCaller.aspx, supprimez tout dans le html, quittez la directive page et utilisez le codebehind pour appeler le service et Response .Ecrivez la chaîne. Prenez également le nom de la méthode Service comme paramètre "HelloWorld" et utilisez la réflexion pour l'invoquer.

C'est un peu montrer votre oreille gauche avec votre main droite mais ça marche. Vous pouvez également facilement intégrer une gestion des rôles et utiliser la réflexion obtenir le nom du service en tant que chaîne vérifier la base de données si l'utilisateur peut appeler ce service et avec réflexion appeler la méthode.

(tout commentaire à ce sujet est la bienvenue :)

0

manqués ce mot clé « statique » dans la déclaration de la méthode s'il vous plaît se pencher sur les éléments suivants il devrait fonctionner.

Pour votre information: Toutes les méthodes Web doivent être statiques

[WebMethod] [ScriptMethod (ResponseFormat = ResponseFormat.Json)]

public static string GetUserRoles(string JSONUserCode) 
    { 
     string retRoles = string.Empty; 
     List<JSONRole> roles = new List<JSONRole>(); 

     {... I Populate the roles here ...} 

     DataContractJsonSerializer serializer = new 
     DataContractJsonSerializer(roles.GetType()); 
     MemoryStream ms = new MemoryStream(); 
     serializer.WriteObject(ms, roles); 
     string jsonString = Encoding.Default.GetString(ms.ToArray()); 
     ms.Close(); 
     return jsonString; 
    } 
3

se trouve que ce n'est pas dataType qui compte, mais

contentType: 'application/json; charset=utf-8'. 

Cela a fonctionné comme un charme.

0

au lieu de retourner une chaîne dans l'utilisation WebMethod:

JavaScriptSerializer js = new JavaScriptSerializer(); 
Context.Response.Write(js.Serialize(YOUR_STRING_TO_OUTPUT)); 
Questions connexes