[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

时间:2010-05-17 17:06:29

标签: jquery ajax web-services

在ASP.net Web服务中,如果未指定上述内容,默认情况下响应格式是什么? 另外,如果我的网络服务如下:

[WebMethod()]
        public List<Sample> GenerateSamples(string[][] data)
        {
            ResultsFactory f = new ResultsFactory(data);

            List<Sample> samples = f.GenerateSamples();
            return samples;
        }

返回对象列表,如果我将响应格式更改为JSON,我必须将返回类型更改为string,然后如何在javascript中访问对象?

目前我在我的JS中调用此Web服务,例如:

 $.ajax({
    type: "POST",
    url: "http://localhost/TemplateWebService/Service.asmx/GenerateSamples",
        data: jsonText,

        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(response) {
            var samples = (typeof response.d) == 'string' ? eval('(' + response.d + ')') : response.d;

            if (samples.length > 0) {
                doSomethingHere(samples);
            } else {
                alert("No samples have been generated");
            }



        },

        error: function(xhr, status, error) {
            var msg = JSON.parse(xhr.responseText);
            alert(msg.Message);
        }

    });

我注意到,尽管一切正常,eval语句永远不会执行,这意味着Web服务总是返回一个字符串!

所以我的问题是,Web服务定义方需要[ScriptMethod(ResponseFormat = ResponseFormat.Json)]吗?

现在的方式,我可以使用samples数组并访问每个对象及其属性,就像我通常在任何OOP代码中一样,这非常方便,一切都没有问题,但我只是想确保我我的设置中没有遗漏任何东西。

我从Encosia方面采用了将Jquery的ajax与asp.net相结合的基础知识,并没有在那里提到响应类型 - 我在另一个网站上阅读它并且我不确定它是多么重要。

http://www.codeproject.com/KB/webservices/JsonWebServiceJQuery.aspx

列出了asp.net Web服务端的4个不同更改。我只有前两个 - 在我的web.config中。服务本身和Sample类是在没有任何序列化的情况下实现的,但它确实具有属性。我猜这个Web服务默认是JSON吗?只要您的对象具有属性,默认情况下它们是可序列化的?在我阅读本文之前,这是我的理解。

1 个答案:

答案 0 :(得分:7)

不需要ResponseFormat属性。包括客户端和服务器设置,只需要做四件事:

  • 在web.config中添加ScriptHandlerFactory HttpHandler。
  • 使用[ScriptService]属性装饰您的Web服务。
  • 使用POST动词请求服务的方法。
  • 使用内容类型“application / json”请求服务的方法。

当您执行这四项操作时,服务方法的响应将自动序列化为JSON。