【问题标题】:wcf 3.5 REST service works with XML but not JSON response formatwcf 3.5 REST 服务适用于 XML,但不适用于 JSON 响应格式
【发布时间】:2010-08-17 16:07:33
【问题描述】:

我有一份服务合同,其中定义了多个运营合同。我添加了一个新端点以将我的操作公开为一个安静的 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 来序列化/反序列化我的对象?

【问题讨论】:

    标签: c# .net wcf json


    【解决方案1】:

    我能够让它工作 - 这就是我所做的。首先,我的环境是 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(这是我习惯使用的)。

    让我知道你得到了什么,我会相应地更新我的答案。

    【讨论】:

      【解决方案2】:

      打开 WCF 跟踪并查看跟踪日志。那应该查明问题出在哪里。您可以使用以下设置配置您的 web.config 以启用跟踪。

      <system.serviceModel>
        <diagnostics>
            <messageLogging logMalformedMessages="true" logMessagesAtTransportLevel="true" />
        </diagnostics>
      </system.serviceModel>
      
      <system.diagnostics>
        <sources>
          <source name="System.ServiceModel" switchValue="Warning, ActivityTracing"
            propagateActivity="true">
            <listeners>
              <add type="System.Diagnostics.DefaultTraceListener" name="Default">
                <filter type="" />
              </add>
              <add name="ServiceModelTraceListener">
                <filter type="" />
              </add>
            </listeners>
          </source>
          <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
            <listeners>
              <add type="System.Diagnostics.DefaultTraceListener" name="Default">
                <filter type="" />
              </add>
              <add name="ServiceModelMessageLoggingListener">
                <filter type="" />
              </add>
            </listeners>
          </source>
        </sources>
        <sharedListeners>
          <add initializeData="C:\Web_tracelog.svclog"
            type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
            name="ServiceModelTraceListener" traceOutputOptions="Timestamp">
            <filter type="" />
          </add>
          <add initializeData="C:\Web_messages.svclog"
            type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
            name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">
            <filter type="" />
          </add>
        </sharedListeners>
      </system.diagnostics>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-27
        • 2015-09-15
        • 1970-01-01
        • 1970-01-01
        • 2016-09-19
        相关资源
        最近更新 更多