来自WCF服务的奇怪响应,如何轻松返回json

时间:2011-11-12 16:48:28

标签: wcf json

我想获得一个只用JSON响应的服务。我写了以下代码:

namespace BM.Security
{
    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class AssocFileService
    {


        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        public List<Person> GetPeople(int message)
        {

            List<Person> myList = new List<Person>();

            Person p = new Person() 
            { 
                Age = 28,
                Name="Name1"
            };
            Person p2 = new Person()
            {
                Age = 26,
                Name = "Name2"
            };

            myList.Add(p);
            myList.Add(p2);



            return myList;
        }

    }

    [DataContract]
    public class Person
    {
        [DataMember]
        public string Name { get; set; }

        [DataMember]
        public int Age { get; set; }
    }
}

但是我得到了以下JSON,这真的很奇怪......

{ "d" : [ { "Age" : 28,
        "Name" : "Name1",
        "__type" : "Person:#Bm.Security"
      },
      { "Age" : 26,
        "Name" : "Name2",
        "__type" : "Person:#BM.Security"
      }
    ] }

我完全被“d”所困扰,不知道它来自哪里。还有__type变量,不,谢谢你真的不想在我的Json中:-(如何在我的数据中设置根节点来代替d?d来自哪里?这么多问题...... < / p>

希望有人能帮忙......

4 个答案:

答案 0 :(得分:4)

WebInvoke属性与BodyStyle属性一起使用,如下所示:

[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json,
           BodyStyle = WebMessageBodyStyle.Bare)]
public List<Person> GetPeople(int message)
{
.
.
.
}

指定WebMessageBodyStyle.Bare后,请求响应都不会被包装。请检查这是否有帮助。

更新1

[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json,
           BodyStyle = WebMessageBodyStyle.Bare)]
public List<Person> GetPeople(int message);

这在ASP.NET网站上的WCF服务器上运行良好

更新2

还有一个比你需要做的还要多。您需要在endpoint中将webHttp指定为web.config,您可以将其用作服务,而http请求将使用WebMessageBodyStyle.Bare,而不会包装您的JSON

<behaviors>
  <serviceBehaviors>
    <behavior name="AssocFileServiceBehavior">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="web">
      <webHttp />
    </behavior>
  </endpointBehaviors>
</behaviors>
<services>
  <service behaviorConfiguration="AssocFileServiceBehavior" name="BM.Security.AssocFileService">
    <endpoint address="" binding="webHttpBinding" contract="BM.Security.IAssocFileService" behaviorConfiguration="web" />
  </service>
</services>

我准备了一个ASP.NET网站。您可以download并查看此内容。

答案 1 :(得分:1)

WR到d:你需要一个对象来包含json中的数组。

默认情况下,该类型包含在JavascriptSerializer中。

答案 2 :(得分:1)

您可以使用WCF Web HTTP programming model轻松完成此操作。这是一个合理且常见的请求,因此我在Anatomy of a simple REST service上撰写了一篇博文,其中显示并解释了代码,并包含了要下载的示例代码。 HTH。

答案 3 :(得分:0)

如果d对象通过GET作为json返回,则它会包装一个数组,因为这会使用户容易受到JSON劫持。恶意用户可以通过使用 defineSetter 更改Object的原型来获取数据。这仅适用于JSON数组,因为它们被视为有效的javascript并按此执行