我想获得一个只用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>
希望有人能帮忙......
答案 0 :(得分:4)
将WebInvoke
属性与BodyStyle
属性一起使用,如下所示:
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare)]
public List<Person> GetPeople(int message)
{
.
.
.
}
指定WebMessageBodyStyle.Bare
后,请求和响应都不会被包装。请检查这是否有帮助。
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare)]
public List<Person> GetPeople(int message);
这在ASP.NET网站上的WCF服务器上运行良好
还有一个比你需要做的还要多。您需要在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并按此执行