2009-11-05 390 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/