2009-11-05 5 views
4

J'ai la méthode d'essai suivante:Comment renvoyer JSON à partir de ASP.NET .asmx?

Imports System.Web 

Imports System.Web.Services 

Imports System.Web.Services.Protocols 


<WebService(Namespace:="http://tempuri.org/")> _ 

<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ 

<System.Web.Script.Services.ScriptService()> _ 

Public Class DemoService 
Inherits System.Web.Services.WebService 

<WebMethod()> _ 
Public Function GetCustomer() As String 
    Return "Microsoft" 
End Function 


End Class 

Même avec l'attribut ResponseFormat ajouté la réponse est toujours d'être renvoyée au format XML plutôt que JSON.

Pensées appréciées.

Répondre

5

Avez-vous installé .NET 3.5 ou supérieur?

ScriptServiceAttribute est dans .NET 3.5 et 4.0.

Également, effacez vos fichiers temporaires ASP.NET, le proxy dynamique peut être mis en cache.

+0

Target est .NET 3.5. Effacer les fichiers temporaires et obtenir toujours la même réponse. – ChrisP

+0

Votre code semble solide, essayez de changer votre balise ScriptService à ceci, _. –

1

C'est ce que je fais, mais il y a probablement une meilleure approche, ça marche pour moi:

[WebMethod] 
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)] 
public string retrieveWorkActivities(int TrackNumber) 
{ 
      String s = {'result': 'success'}; 
      return s.ToJSON(); 
} 
+0

Ne voulez-vous pas dire 'String s =" {'result': 'success'} ";'? Et évidemment vous avez posté C# et la question était VB.Net (je sais que tout le monde le fait) – MarkJ

+0

@markJ - Je n'avais pas d'exemple dans VB.NET, mais je montrais principalement les annotations, mais je n'ai pas pensez à la langue non plus. Et j'ai enlevé la double citation. Merci. –

2

Pourquoi ne pas simplement utiliser un fichier ashx? C'est un gestionnaire générique. Très facile à utiliser et à renvoyer des données. Je les utilise souvent à la place de créer un service web car ils sont beaucoup plus légers.

Un exemple de la mise en œuvre dans le ashx serait:

// ASHX details 
DataLayer dl = GetDataLayer(); 
List<SomeObject> lst = dl.ListSomeObjects(); 
string result = ""; 
if (lst != null) 
{ 
    JavaScriptSerializer serializer = new JavaScriptSerializer(); 
    result = serializer.Serialize(lst); 
} 
context.Response.ContentType = "application/json"; 
context.Response.Write(result); 
context.Response.End(); 

Si vous avez besoin d'utiliser un service Web que vous pouvez définir le ResponseFormat. Consultez cette question SO qui a ce que vous recherchez:

How to let an ASMX file output JSON

+0

@chrisp Avez-vous déjà réglé votre problème? Si cette réponse ou une autre vous a aidé, vous devez définir une réponse acceptée afin que les autres personnes qui lisent cette question puissent trouver la solution qui vous a aidé. – Kelsey

0

Si vous êtes limité au Framework 2.0, vous pouvez utiliser le JavaScriptSerializer, de l'ensemble System.Web.Extensions, comme celui-ci (en C#):

[WebMethod()] 
[ScriptMethod()] 
public static string GetJsonData() { 
    // data is some object instance 
    return new JavaScriptSerializer().Serialize(data); 
} 
0

J'ai aussi utilisé des cendres pour ce problème. Pour être honnête, je ne savais pas que les webservices avaient cet attribut ResponseFormat. Cela dit, je pense que je préfère encore la voie de l'ashx pour la légèreté et le contrôle.

Il y a quelques détails de périphériques laissés ici, pour se concentrer sur le bit dont vous auriez besoin.

Imports Newtonsoft.Json 
    Imports Newtonsoft.Json.Linq 

    Namespace Handlers.Reports 

     Public MustInherit Class Base 
      Implements IHttpHandler, SessionState.IRequiresSessionState 


      Protected data As String()() = Nothing 
      Private Shared ReadOnly JsonContentType As String = "application/json" 

      Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest 

       Try 

        Me.GetData() 
        Me.BuildJsonResponse(context) 

       Catch ex As Exception 

       End Try 

       context.Response.End() 

      End Sub 

    Private Sub BuildJsonResponse(ByVal context As System.Web.HttpContext) 

       context.Response.AddHeader("Content-type", Base.JsonContentType) 

       Dim json = Me.BuildJson() 
       context.Response.Write(json) 

      End Sub 

      Private Function BuildJson() As String 

       If Not Me.data Is Nothing Then 

        Return String.Format("{{data: {0}, pageInfo: {{totalRowNum:{1}}}, recordType: 'array'}}", JsonConvert.SerializeObject(Me.data), Me.totalRows) 

       End If 

       Return String.Empty 

      End Function 
End Class 

End Namespace 
7

Je suis un peu en retard à cette question, mais nous espérons que cela vous aide ou quelqu'un d'autre trébuchant sur ce fil plus tard. Vous pouvez certainement use ASMX services to communicate in JSON.

Votre code de service semble correct. Puisque vous ne montrez pas comment vous l'appelez, je parie que c'est là votre problème. Une exigence pour obtenir JSON hors de ASMX "ScriptServices" est que vous devez les appeler avec l'en-tête de type de contenu correct et vous devez utiliser une demande POST. Scott Guthrie a un bon post sur the reasoning behind those requirements.

Donc, si vous demandez simplement DemoService.asmx/GetCustomer dans un navigateur, vous obtiendrez XML. Toutefois, si vous effectuez une requête POST avec un type de contenu application/json, vous obtiendrez le même résultat sérialisé que JSON.

Si vous utilisez jQuery, voici un exemple de la façon dont vous demander votre DemoService sur le côté client:

$.ajax({ 
    type: "POST", 
    contentType: "application/json", 
    url: "DemoService.asmx/GetCustomer", 
    data: "{}", 
    dataType: "json", 
    success: function(response) { 
    // Prints your "Microsoft" response to the browser console. 
    console.log(response.d); 
    } 
}); 

Plus ici: http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/

0

Désolé pour répondre à l'ancien poste. si nous devons renvoyer json d'un objet spécifique, nous pouvons également suivre cette approche.

[WebService(Namespace = "http://contoso.com/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]System.Web.Services.WebService 
[ScriptService] 
public class services :WebService 
{  
    [WebMethod(CacheDuration = 60)] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public List<TestObject> GetObjectCollection() 
    { 
      return YourService.GetObjectCollection().ToList(); 
    } 
} 

bon article existe de ce lien https://cmatskas.com/getting-json-data-using-an-asmx-web-service/

Questions connexes