f#不能发布到web api

本文关键字:web api 不能 | 更新日期: 2023-09-27 18:03:05

我有以下代码发布到一个web api。

[<CLIMutable>]
type MyModel = { FileName:string; Period:DateTime; DownloadedTime:DateTimeOffset; Url:string; }
let PostDownload (filepath, date, url) = 
  async {
    try
        use client = new HttpClient()
        let content = { FileName = filepath; Period = date; DownloadedTime = DateTimeOffset.Now; Url = url }
        let! response = Async.AwaitTask(client.PostAsJsonAsync("http://localhost:5000/api/DownloadedFiles", content))
    with 
    | ex -> logger.Error(ex, "Exception: " + ex.Message)
  } |> Async.Start

服务有以下代码,调试器显示downloadedFile的所有字段都是默认值(null或值类型的最小值)。

    [HttpPost]
    public void Post([FromBody]DownloadedFile downloadedFile)
    {
        try
        {
            _context.DownloadedFile.Add(downloadedFile);
            _context.SaveChanges();
        }
        catch (Exception ex) { ...... }
    }

提琴显示f#代码(或PostAsJsonAsync不能处理f#可变记录类型?)添加@在字段名称的末尾?

{"FileName@":"测试"、"Period@":"2100 - 01 - 01 t00:00:00"、"DownloadedTime@":"2016 - 08 - 18 - t15:50:37.5004391内","Url@":"测试"}

f#不能发布到web api

我不知道你从哪里得到HttpClient.PostAsJsonAsync,因为它不是我目前正在看的HttpClient版本。尽管如此,我通常使用这个扩展,它适用于我:

type HttpClient with
    member this.PostAsJsonAsync (requestUri : string, value : obj) =
        let json = string value
        let content = new StringContent (json)
        content.Headers.ContentType <-
            Headers.MediaTypeHeaderValue "application/json"
        this.PostAsync (requestUri, content)

我刚刚遇到这个问题,花了几个小时来解决它。它似乎是在HttpClient中使用的序列化器。PostAsJsonAsync不能很好地处理fsharp类型。@符号问题也不容易在谷歌上搜索到。然而,使用下面的代码似乎可以工作:

task {
  let content = JObject.FromObject({ Id = "foo" }).ToString()
  let! response = client.PostAsync("url", new StringContent(content, Encoding.UTF8, "application/json"))
  return "Hello world"
}