F#Http.AsyncRequestStream刚刚';挂起';关于长查询

F#Http.AsyncRequestStream刚刚';挂起';关于长查询,http,f#,f#-data,Http,F#,F# Data,我的工作对象是: let callTheAPI = async { printfn "\t\t\tMAKING REQUEST at %s..." (System.DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss")) let! response = Http.AsyncRequestStream(url,query,headers,httpMethod,requestBody) printfn "\t\t\t\tREQUEST MAD

我的工作对象是:

let callTheAPI = async {
    printfn "\t\t\tMAKING REQUEST at %s..." (System.DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss"))
    let! response = Http.AsyncRequestStream(url,query,headers,httpMethod,requestBody)
    printfn "\t\t\t\tREQUEST MADE."
}

调用web API(REST)和
let!response=Http.AsyncRequestStream(url、查询、标题、httpMethod、requestBody)
仅挂起某些查询。特别是需要很长时间(>4分钟)的。这就是为什么我将其设置为异步并设置4分钟超时。(我收集超时的呼叫,并使用较小的时间范围参数进行呼叫)

我首先从FSharp.Data启动了
Http.RequestStream
,但我无法为此添加超时,因此脚本只能“挂起”

我在IIS管理器中查看了API的IIS服务器和
应用程序池
工作进程
活动请求
,我可以看到请求传入和传出。然后它们“消失”,F#脚本挂起。我在脚本端或服务器端的任何位置都找不到错误消息

我包括了
Flush()
并删除了超时,但它仍然挂起。(在流程中删除异步)

其他: 成功呼叫。失败的调用之后可以是成功的调用。然而,它似乎到达了一个点,所有的调用都超时了,服务器甚至不再到达服务器。(工作进程活动请求不显示查询)

更新:

我让Fsx脚本输出查询,并通过IRM运行它们,但现在出现了问题(我有超时,它从不锁定)。我怀疑FSharp.Data.Http有问题。

Async.RunSynchronously
块。阅读文档中的备注部分:。相反,请使用
Async.AwaitTask

Async.RunSynchronously
块。阅读文档中的备注部分:。相反,使用
Async.AwaitTask

是否从UI或web请求内部调用?可能是这个问题()导致了死锁吗?我正在从VS2015的interactive运行的.fsx脚本中调用。我已经在没有任何显式异步的情况下运行了。仅使用FSharp.Data中的
Http.RequestStream
(没有超时),我看到了相同的行为。(除此之外,没有超时,对“挂起”的第一个查询只是挂起。)。简单地
let response=Http.RequestStream(url、查询、标题、httpMethod、requestBody)
使用respStm=response.ResponseStream;;respStm.Flush();;写入到输出(responseLines respStm)
。我只在超时时使用了一个异步块。另外:除了一件小事之外,我跟这篇文章没什么关系。我正在将异步块中的调用从
let
to`let response=Http.RequestStream(url、查询、标题、httpMethod、requestBody)```查看这是否有帮助。另外:删除let!似乎停止超时工作。所以调用挂起…您是从UI还是web请求内部调用的?可能是这个问题()导致了死锁吗?我正在从VS2015的interactive运行的.fsx脚本中调用。我已经在没有任何显式异步的情况下运行了。仅使用FSharp.Data中的
Http.RequestStream
(没有超时),我看到了相同的行为。(除此之外,没有超时,对“挂起”的第一个查询只是挂起。)。简单地
let response=Http.RequestStream(url、查询、标题、httpMethod、requestBody)
使用respStm=response.ResponseStream;;respStm.Flush();;写入到输出(responseLines respStm)
。我只在超时时使用了一个异步块。另外:除了一件小事之外,我跟这篇文章没什么关系。我正在将异步块中的调用从
let
to`let response=Http.RequestStream(url、查询、标题、httpMethod、requestBody)```查看这是否有帮助。另外:删除let!似乎停止超时工作。所以调用挂起了…真遗憾,所有异步文章都在演示代码中使用RunSynchronously,却从未解释过。嗨,杰克,谢谢。WaitTask不接受CancellationToken或超时参数。我使用RunSynchronously的唯一原因是我可以超时任务。我正在尝试:
let task=Async.startask(callTheAPI,cancellationToken=cts.Token)task.Wait()
以查看我是否仍然可以获得超时行为这以同样的方式失败。我现在正在研究一种非fsharp的调用方法。找出它是否是FSharp.Data库。真遗憾,所有异步文章都在演示代码中使用RunSynchronously,但从来没有解释过。嗨,杰克,谢谢。WaitTask不接受CancellationToken或超时参数。我使用RunSynchronously的唯一原因是我可以超时任务。我正在尝试:
let task=Async.startask(callTheAPI,cancellationToken=cts.Token)task.Wait()
以查看我是否仍然可以获得超时行为这以同样的方式失败。我现在正在研究一种非fsharp的调用方法。以确定它是否是FSharp.datalibrary。
let cts = new System.Threading.CancellationTokenSource()
let timeout = 1000*60*4//4 minutes (4 mins no grace)
cts.CancelAfter(timeout)
Async.RunSynchronously(callTheAPI,timeout,cts.Token) 
use respStrm = response.ResponseStream
respStrm.Flush()
writeLinesTo output (responseLines respStrm)