【发布时间】:2017-05-05 08:25:37
【问题描述】:
我有一个 Azure 移动应用服务,PullAsync 正在静默失败。
在后端,DTO 如下所示:
type TablesDto() =
[<JsonProperty("id")>] member val Id = String.Empty with get, set
[<JsonProperty("deleted")>] member val Deleted = false with get, set
[<JsonProperty("createdAt")>] member val CreatedAt = Nullable<DateTimeOffset>() with get, set
[<JsonProperty("updatedAt")>] member val UpdatedAt = Nullable<DateTimeOffset>() with get, set
[<JsonProperty("version")>] member val Version = [||] with get, set
interface ITableData with
member this.Id with get() = this.Id and set(value) = this.Id <- value
member this.Deleted with get() = this.Deleted and set(value) = this.Deleted <- value
member this.CreatedAt with get() = this.CreatedAt and set(value) = this.CreatedAt <- value
member this.UpdatedAt with get() = this.CreatedAt and set(value) = this.UpdatedAt <- value
member this.Version with get() = this.Version and set(value) = this.Version <- value
type MyEntityDto() =
inherit TablesDto()
[<JsonProperty("entityName")>] member val EntityName = String.Empty with get, set
我正在使用 DomainManager 将对象从我的数据库架构映射到此 DTO 表单,但我不确定这是否相关。
在前端(在 Xamarin Android 应用中),DTO 定义为
type MyEntityDto() =
[<JsonProperty("id")>] member val Id = String.Empty with get, set
[<JsonProperty("version"); AzureVersion>] member val Version = Unchecked.defaultof<String> with get, set
[<JsonProperty("createdAt")>] member val CreatedUtc = DateTime.MinValue with get, set
[<JsonProperty("updatedAt")>] member val UpdatedUtc = DateTime.MinValue with get, set
[<JsonProperty("entityName")>] member val EntityName = String.Empty with get, set
出于调试目的,我使用了以下处理程序来检查从服务器返回的 JSON:
#if DEBUG
type DebuggingHandler() =
inherit DelegatingHandler()
let deserialise content =
try
let deserialised = JsonConvert.DeserializeObject<MyEntitypDto[]>(content)
deserialised |> ignore
with
| ex ->
ex |> ignore
override this.SendAsync(message, cancellationToken) =
let sendAsync = base.SendAsync(message, cancellationToken)
async {
let! response = sendAsync |> Async.AwaitTask
let! content = response.Content.ReadAsStringAsync() |> Async.AwaitTask
deserialise content
return response
} |> Async.StartAsTask
#endif
在调试器中检查content 值显示:
[{"myEntityName@":"Harry","id@":"2","deleted@":true,"createdAt@":"2017-04-26T11:20:46.83Z","updatedAt@":"2017-04-26T11:20:46.83Z","version@":"AAAAAAAAO/Y="},
{"myEntityName@":"Gary","id@":"3","deleted@":false,"createdAt@":"2017-04-26T11:23:05.16Z","updatedAt@":"2017-04-26T11:23:05.16Z","version@":"AAAAAAAAO/c="}]
这个“@”符号后缀是怎么回事?它可以防止对象在调试器中反序列化,我怀疑这就是 PullAsync 方法被回收的原因。
这是 F# 的一些奇怪的副作用吗?我怎样才能摆脱这些“@”符号(如果这是导致我的表同步中断的原因)?
编辑我添加了一个 C# 标签,因为这可能与典型企业环境中 F# 和 C# 之间的差异有关。
【问题讨论】:
-
这些是您的属性的内部支持字段的名称。出于某种原因,您的 JSON 序列化程序使用字段而不是属性,即使它们被属性修饰。
-
谢谢费奥多尔。这让我找到了答案。 TableSync 现在可以正常工作了。
标签: c# android azure f# azure-mobile-services