System.Net.Http.HttpClient在JSON键的末尾添加@。为什么?

时间:2013-05-08 12:12:20

标签: asp.net-mvc json httpclient

我有一个非常简单的问题,我无法解决。

我有一个像这样定义的Action方法:

    [HttpPut]
    public ActionResult Register(ClientRegistrationInformation clientInformation)
    { ... }

ClientRegistrationInformation在F#中定义如下:

type ClientRegistrationInformation () =
    member val ClientKey = Guid.Empty with get, set
    member val ValidationToken = String.Empty with get, set

我想使用System.Net.Http.HttpClient调用此操作方法。当我尝试这个时:

httpClient.PutAsJsonAsync (RegisterUrl, clientInformation)

JSON内容是这样发送的,不起作用:

"{\"ClientKey@\":\"8cb33ed5-ef49-4c40-afbe-78f0c198448e\",\"ValidationToken@\":\"token\"}"

当我使用jQuery.ajax尝试相同的内容时,内容会像这样发送,它可以工作:

"{\"ClientKey\":\"8cb33ed5-ef49-4c40-afbe-78f0c198448e\",\"ValidationToken\":\"token\"}"

为什么HttpClient会在名称的末尾添加不必要的@符号? 我如何摆脱它们?

感谢。

1 个答案:

答案 0 :(得分:0)

好的。我发现了这个问题。我很蠢。

事实证明,F#的自动属性是以序列化程序选择支持字段的方式实现的,该字段与属性相同,但最后添加了@。

通过更改ClientRegistrationInformation的声明,问题就消失了:

type ClientRegistrationInformation () =
    let mutable clientKey = Guid.Empty
    let mutable validationToken = String.Empty
    member this.ClientKey
        with get () = clientKey
        and  set v  = clientKey <- v
    member this.ValidationToken
        with get () = validationToken
        and  set v  = validationToken <- v

愚蠢的错误。 :)