【问题标题】:Disable Type Hinting in WCF JSON Services在 WCF JSON 服务中禁用类型提示
【发布时间】:2025-12-05 20:50:01
【问题描述】:

我有一个相对简单的问题,但我似乎找不到答案。

当 WCF 执行其对象序列化时,它会自动应用类型提示。对于 Json 服务,这会在每个复杂对象上产生一个名为 __type 的额外字段。一个对象定义为:

[DataContract]
public class SomeObject
{
    [DataMember]
    public string First { get; set; }

    [DataMember]
    public string Last { get; set; }
}

会序列化为:

{
    "First" : "Hello",
    "Last" : "World!",
    "__type" : "SomeObject#MyNamespace.SomeObject"
}

通常这不是问题。不幸的是,当您开始将类嵌套到相当大且复杂的结构中时,这会导致返回客户端的 JSON 响应的大小产生大量开销。

当然必须有一种方法来禁用此行为,但我一直找不到(Rick Strahl back in 2007 也没有...但现在是 2010 年,我希望有人能解决这个问题)。

【问题讨论】:

    标签: c# .net wcf json serialization


    【解决方案1】:

    我假设您在行为配置中使用 <enableWebScript/>,将其替换为 <webHttp defaultOutgoingResponseFormat="Json"/>,您将获得干净整洁的 json

    【讨论】:

    • 当我为 .NET 3.5SP1 尝试它时失败了。这可能是 4.0 的东西吗?
    • "不允许使用 defaultOutgoingResponseFormat 属性"
    • 长期以来,我一直在寻找摆脱“__type”的解决方案。这对我来说是完美的,谢谢!
    • 我在控制台(不是 ASP.Net)上使用 WCF...这对我不起作用 '__type' 仍然出现
    【解决方案2】:

    使用DataContractJsonSerializer 是为了支持多态性并能够反序列化回已知类型。 NewtonSoft 是一个不会添加 __type 提示的第三方 json 序列化程序。如果您只是序列化而不使用真正的高级 DataContract 属性,您可能想尝试一下。

    【讨论】:

      【解决方案3】:

      这对我有用:

      [WebGet(ResponseFormat=WebMessageFormat.Json,BodyStyle = WebMessageBodyStyle.Bare)]
      

      参见第 7 步和第 10 步 http://dotnetdiscoveries.blogspot.com/2008/05/return-json-from-ajax-enabled-wcf.html

      【讨论】:

      • 这也对我有用 - 我还必须将我的 svc 文件上的工厂从 WebScriptserviceHostFactory 更改为 WebServiceHostFactory。
      • 这对我不起作用。我已经按照说明设置了我的 app.config,但我仍然收到__type porperty