0

使用带有方法的 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) 我想删除它,所以响应会更小,我该怎么做?

4

3 回答 3

2

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

[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 标头中指定它,这就是它应该如何工作的。

于 2012-04-06T14:47:33.100 回答
1

好的,我使用 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

它适用于所有服务方法

于 2012-04-07T22:21:07.437 回答
0

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

  • 转到您的 web.config 文件

  • 定位行为。

    在我的例子中,行为被称为“Project1.Services.DataTableAspNetAjaxBehavior”,这可以在下面找到 <system.serviceModel>
    <behaviors>
    <endpointBehaviors>

图片: 在此处输入图像描述

  • 最后,添加<webHttp defaultOutgoingResponseFormat="Json" /> 到您的行为中。

(注意:如果要保留包装器,请使用 add:
<webHttp defaultBodyStyle="Wrapped" defaultOutgoingResponseFormat="Json" />

<webHttp defaultBodyStyle="WrappedResponse" defaultOutgoingResponseFormat="Json" />

我希望这有帮助!快乐编码!

于 2012-10-19T21:39:18.243 回答