我有一份服务契约(Contract),其中定义了多个运营契约(Contract)。我添加了一个新端点,将我的操作公开为静态 Web 服务。此外,我还更新了操作定义,以便可以以 RESTful 方式调用它们
[OperationContract]
[WebInvoke(
Method = "GET",
ResponseFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "product/getall")]
Product[] GetAll()
一切正常,我的产品以 XML 形式返回...但我想使用 JSON。如果我将代码更改为
[OperationContract]
[WebInvoke(
Method = "GET",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "product/getall")]
Product[] GetAll()
对product/getall 调用的响应为空。没有抛出异常,但我有一种不好的感觉,WCF JSON 实现在某种程度上无法应对序列化。有人遇到过类似的问题吗?有什么建议么?是否可以使用 JSON.NET 序列化/反序列化我的对象?
最佳答案
我能够让它发挥作用 - 这就是我所做的。首先,我的环境是 VS2010,我使用的是 VS Web 服务器(Cassini)。
我没有更改您的方法签名或 WebInvoke
属性。 GetAll()
方法的主体如下:
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "product/getall")]
Product[] GetAll()
{
Product[] prods = new Product[3] {
new Product() { Name="Foo", Desc="Bar"},
new Product() {Name="Ha", Desc="Ho"},
new Product() {Name="Who", Desc="What"}
};
return prods;
}
web.config 如下所示:
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="WebApplication2.ProdServiceAspNetAjaxBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
<services>
<service name="WebApplication2.ProdService">
<endpoint address="" behaviorConfiguration="WebApplication2.ProdServiceAspNetAjaxBehavior"
binding="webHttpBinding" contract="WebApplication2.ProdService" />
</service>
</services>
</system.serviceModel>
老实说,其中大部分都是默认的开箱即用功能。我唯一更改的是将 endpointBehavior
更改为使用 webHttp
而不是默认的 enableWebScript
。除此之外,它运行良好。
编辑(忘记了 Product 类):这是 Product 类 - 我用 DataContract
和 DataMember
属性装饰它:
[DataContract]
public class Product
{
[DataMember()]
public String Name { get; set; }
[DataMember()]
public String Desc { get; set; }
}
这是我的输出:
[{"Desc":"Bar","Name":"Foo"},{"Desc":"Ho","Name":"Ha"},{"Desc":"What","Name":"Who"}]
我的猜测是您在 web.config 中使用了 enableWebScript
。将其更改为 webHttp
并看看会发生什么。 enableWebScript
设置用于更多 ASMX 类型的兼容性(我相信)。如果您要返回 JSON(我的很多 GET 服务方法都是这样做的),请使用 webHttp
(这是我习惯使用的)。
让我知道您得到了什么,我会相应地更新我的答案。
关于c# - wcf 3.5 REST 服务使用 XML,但不使用 JSON 响应格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3504544/