【问题标题】:WCF + Json = wrong serializationWCF + Json = 错误的序列化
【发布时间】:2010-02-02 19:07:14
【问题描述】:

为什么这个 WCF 3.5 方法

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Json
{
    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json)]
    public string Upper(string text)
    {
        return text.ToUpper();
    }
}

返回{"d":"TEXT"} ?

它应该返回{"TEXT"}

我正在使用 jQuery 调用。

    $("#upper").click(function() {
        $.ajax({
            type: "GET",
            url: "/Json.svc/Upper?text="+$("#input1").val(),
            success: function(data) {
                $("#input1").val(data.d);
            }
        });
    });

【问题讨论】:

    标签: asp.net jquery wcf json


    【解决方案1】:

    这是已添加到 .NET 3.5 中的 JSON 序列化的安全功能。它是一个容器对象,所以不用说results[0],您只需说results.d[0]。阅读this article了解更多信息。

    【讨论】:

    • 不错的布兰登,但我可以删除/禁用它吗?
    • 我不知道。但是你为什么要禁用它呢?如果您禁用它,这是一个很大的安全风险。正如文章所说,现在处理“d”容器对象是值得的。
    • 另外,{'Text'} 不是有效的 JSON。在 jQuery 1.4.x 中,这会带来麻烦,因此 .d 也很适合这个原因。
    【解决方案2】:

    我假设您在行为配置中使用<enableWebScript/>,将其替换为<webHttp defaultOutgoingResponseFormat="Json"/>,您将获得没有根“d”且没有“__type”道具的json。

    但是,我只在 4.0 中测试过这个

    我也不在代码中使用任何属性。

    【讨论】:

    • 这不行,你还是得有bodystyle = webmessagebodystyle.wrappedrequest,其中包括“d”和“___type”。如果将其更改为 Bare,则会收到 WebScriptEnablingBehavior 不支持 Bare 的错误。
    • 我可以向你保证它确实有效,但我应该澄清一下我只在 4.0 中测试过,并且我没有在代码中使用任何属性。
    【解决方案3】:

    您是否尝试过更改 [WebGet] 属性的 BodyStyle 属性以使响应不被包装?

    【讨论】:

    • 是的,但我得到这个异常“'WebScriptEnablingBehavior' 不支持'Wrapped' 的主体样式。将主体样式更改为'WrappedRequest'。”或“'WebScriptEnablingBehavior' 不支持正文样式 'Bare'。将正文样式更改为 'WrappedRequest'。”
    • 如果您使用的是 webScriptEnablingBehavior,那么是的,它可能会导致问题。您是否有特定的原因需要它而不是 webHttpBehavior?另外,你检查过这个吗:west-wind.com/weblog/posts/324917.aspx
    • 没有特别的原因。我昨天确实喜欢你的链接,但我认为我的 web.config 是错误的,所以我得到了另一个关于 bing 的教程。那是教程工作正常,唯一的问题是这个“属性”。
    • 如果您不使用 webscriptenable 行为,那么当您尝试在网络浏览器中查看调用时,它会返回 400 错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    相关资源
    最近更新 更多