c# - wcf 3.5 REST 服务使用 XML,但不使用 JSON 响应格式

标签 c# .net wcf json

我有一份服务契约(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 类 - 我用 DataContractDataMember 属性装饰它:

[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/

相关文章:

c# - Prism 事件聚合器无法在单独的模块中工作

c# - 使用标记类来控制逻辑流

.net - 如何在Visual Studio中自动更新ErrorList?

c# - 将保存按钮绑定(bind)到 DataTable

c# - 在方法中写入 "return"的完美方法是什么

c# - HttpClient存放在什么程序集

c# - WCF 服务。如何返回 HTTP 500 响应

c# - 在 C# 中显示引用地址(调试 WCF)

c# - 连接到 HTTPS 的 WebClient 在某些电话设备上出现 NotFound 错误

.net - 在 xaml 中使用数据模板时如何对不同的项目设置不同的样式?