2009-11-05 414 views
4

我有以下測試方法:如何從ASP.NET .asmx返回JSON?

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 

即使有ResponseFormat屬性添加的響應仍然被返回作爲XML而不是JSON。

想法感激。

回答

5

您是否安裝了.NET 3.5或更高版本?

ScriptServiceAttribute在.NET 3.5和4.0中。

此外,清除您的ASP.NET臨時文件,可以緩存動態代理。

+0

目標是.NET 3.5的存在。 清除臨時文件仍然得到相同的響應。 – ChrisP 2009-11-06 04:13:16

+0

您的代碼看起來很穩固,請嘗試將您的ScriptService標記更改爲 _。 – 2009-11-06 04:55:45

1

這是我做的,雖然有可能是一個更好的方法,它爲我工作:

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

你是不是指'String s =「{'result':'success'}」;'?顯然你已經發布了C#,問題是VB.Net(我知道所有人都這樣做) – MarkJ 2009-11-05 11:00:54

+0

@markJ - 我沒有在VB.NET中的例子,但我主要是顯示註釋,但我沒有想想這個語言。我刪除了雙引號。感謝名單。 – 2009-11-05 13:51:00

2

爲什麼不直接使用一個ASHX文件?這是一個通用的處理程序。非常容易使用並返回數據。我經常使用這些代替創建Web服務的地方,因爲它們更輕。

在ashx的實施的一個例子是:

// 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(); 

如果確實需要使用Web服務,雖然你可以設置ResponseFormat。看看這個SO疑問,有你在找什麼:

How to let an ASMX file output JSON

+0

@chrisp你有沒有把你的問題整理出來?如果這個答案或另一個幫助你,你應該設置一個被接受的答案,以便其他讀這個問題的人可以找到幫助你的解決方案。 – Kelsey 2010-08-18 16:16:50

0

如果你限制在2.0框架,你可以使用JavaScriptSerializer,從System.Web.Extensions裝配,像這樣(在C#):

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

我也對這個問題使用了ashxes。說實話,我不知道Web服務有ResponseFormat屬性。這就是說我認爲我仍然更喜歡ashx路線來實現輕鬆和控制。

有一些外圍的細節留在這裏,專注於你需要的位。

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

我對這個問題有點遲,但希望這可以幫助你或任何其他人絆倒到這個線程後。

你當然可以use ASMX services to communicate in JSON

您的服務代碼看起來沒問題。既然你沒有展示你怎麼稱呼它,我敢打賭這就是你的問題所在。將JSON從ASMX「ScriptServices」中取出的一個要求是您必須使用正確的內容類型標頭調用它們,並且您必須使用POST請求。 Scott Guthrie有一篇關於the reasoning behind those requirements的好文章。

因此,如果您只是在瀏覽器中請求DemoService.asmx/GetCustomer,那麼您將獲得XML。但是,如果您使用application/json內容類型發出POST請求,則會得到與JSON序列化相同的結果。

如果你使用jQuery,這裏是你將如何請求對客戶端的DemoService一個例子:

$.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); 
    } 
}); 

這裏更多:http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/

0

對不起,回答舊帖子。如果我們需要返回特定對象的json,那麼我們也可以採用這種方法。

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

好文章從這個鏈接https://cmatskas.com/getting-json-data-using-an-asmx-web-service/