【问题标题】:asp.net webservice return json typeasp.net webservice返回json类型
【发布时间】:2012-04-06 11:38:37
【问题描述】:

通过方法使用asp.net webservice:

[WebMethod(EnableSession = true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public List<MyObject> GetList()
{
    ....return new List of MyObject{ x =  .., y = .. , z = ..};
}

使用该服务的客户端使用 JQuery Ajax 调用运行良好

$.ajax({
        type: "POST",
        url: url,
        data: data == null ? "{}" : data,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
 ..... and so on ... 

但是对于萤火虫,我注意到响应是:

{"d":[{"__type":"Common.MyObject","z":"2000","x":1500,"y":1000,"a":"0"},{"__type":"Common.MyObject","z":"2000","x":1455,"y":1199.57,"a":"1"} ...... and so on ]}

1) 问题是为什么我需要这个 ""__type":"Common.MyObject" ?
2)我想删除它,这样响应会更小,我该怎么做?

【问题讨论】:

    标签: json web-services


    【解决方案1】:

    当我像这样配置网络服务时,它对我来说很好:

    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    class MyObjectService
    {
        [OperationContract]
        [WebGet(UriTemplate = "MyObjects", ResponseFormat = WebMessageFormat.Json)]
        public IEnumerable<MyObect> GetAlMylObjects()
        {
            MyObjectMgr objectMgr = new MyObjectMgr();
            return objectMgr.GetAll();
        }
    
    }
    

    这是 MyObjectMgr 的代码:

    public class MyObjectMgr
    {
        public List<MyObect> GetAll()
        {
            List<MyObect> objList = new List<MyObect>();
            objList.Add(new MyObect { x = 1, y = 21, z = 33 });
            objList.Add(new MyObect { x = 4, y = 51, z = 66 });
            return objList;
    
        }
    }
    

    下面是响应的样子:

    [{"x":1,"y":21,"z":33},{"x":4,"y":51,"z":66}]
    

    我使用的是 GET 而不是 POST,但我认为这不会有什么不同。如果您只是检索想要使用 GET 的信息,通常用于 REST API。

    我已停止将 WCF 用于 RESTful Web 服务,因为它难以配置且易受攻击。我已经开始使用ASP.NET Web API,它是即将发布的 MVC 4.0 版本的一部分。设置 RESTful API 更容易。您不必指定在服务中是需要 JSON 还是 XML。客户端可以在 HTTP 标头中指定它,这就是它应该如何工作的。

    【讨论】:

      【解决方案2】:

      好的,我使用httpmodule和regex来改变响应

      http模块: http://bloggingabout.net/blogs/adelkhalil/archive/2009/08/14/cross-domain-jsonp-with-jquery-call-step-by-step-guide.aspx#525423

      正则表达式: https://stackoverflow.com/a/6349813/1218546

      它适用于所有服务方法

      【讨论】:

        【解决方案3】:

        抱歉,回复晚了!我最近遇到了类似的问题。通过执行以下操作,我能够在不重写服务的情况下修复它:

        • 转到您的 web.config 文件

        • 定位行为。

          在我的例子中,行为被称为 "Project1.Services.DataTableAspNetAjaxBehavior",这可以在下面找到 &lt;system.serviceModel&gt;
          &lt;behaviors&gt;
          &lt;endpointBehaviors&gt;

        图片:

        • 最后,将&lt;webHttp defaultOutgoingResponseFormat="Json" /&gt; 添加到您的行为中。

        (注意:如果您想保留包装,请使用添加:
        &lt;webHttp defaultBodyStyle="Wrapped" defaultOutgoingResponseFormat="Json" /&gt;
        OR
        &lt;webHttp defaultBodyStyle="WrappedResponse" defaultOutgoingResponseFormat="Json" /&gt;

        我希望这会有所帮助!编码愉快!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-04
          • 2013-09-13
          • 1970-01-01
          • 1970-01-01
          • 2010-10-17
          • 2011-05-06
          相关资源
          最近更新 更多