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@":"测试"}
我不知道你从哪里得到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"
}