gpt4 book ai didi

F# 异步 web 请求,处理异常

转载 作者:行者123 更新时间:2023-12-04 15:28:17 27 4
gpt4 key购买 nike

我正在尝试在 F# 中使用异步工作流来获取多个 Web 请求。

但是,我的一些请求偶尔会返回错误(例如 http 500),我不知道如何处理。在调试器中运行时,我的 F# 程序似乎陷入了无限循环。

我可能遗漏了一些东西,因为我看到的例子不是开箱即用的。我发现有帮助的第一件事是这段代码:

type System.Net.WebRequest with
member req.GetResponseAsync() =
Async.BuildPrimitive(req.BeginGetResponse, req.EndGetResponse)

然后我有一些代码来获取请求,这在我见过的示例中非常标准:
let async_value = async {
let req = WebRequest.Create(url)
let! rsp = req.GetResponseAsync()
return (rsp :?> HttpWebResponse).StatusCode
}

然后我尝试得到结果:
let status = Async.RunSynchronously(async_value)

但是当我在调试器中运行我的程序时,它在 req.EndGetResponse 处中断因为服务器返回内部服务器错误 500。如果我继续执行,它会进入一个时髦的循环,在 req.EndGetResponse 处中断。 (有时连续几个),然后让 status = Async.RunSynchronously (异步值)。

如何解决异常问题以便获取状态代码?另外,我需要上面做的类型吗?或者我是否缺少 F#/VS 2010 Beta 1 的一些库/dll,这已经是其中的一部分?

我实际上并行运行多个请求,使用 Async.RunSynchronously ( Async.Parallel (my_array_of_async_values)),但我认为这与我遇到的异常问题无关。

事实上,我遇到的例子只使用 Async.Run而不是 Async.RunSynchronously可能是我遗漏了一些东西的指标... =/

最佳答案

它现在称为“AsyncGetResponse”(不再是“GetResponseAsync”)。并且“Run”更名为“RunSynchronously”。所以我不认为你在这里遗漏了任何实质性的东西,只是在最新版本中更改了名称。

关于“Tools\Options\Debugging\General\Enable Just My Code”和“Debug\Exceptions”的调试器设置是什么(例如,设置为在抛出任何第一次机会 CLR 异常时中断)?我不清楚您的问题是涉及程序行为还是 VS 工具行为(听起来像后者)。 F# Beta1 中的断点/调试“位置”存在一些错误,尤其是在异步工作流方面,这意味着即使程序正确执行,您在调试器中看到的行为看起来也可能有点奇怪,这使这一事实更加令人困惑。 .

你使用的是VS2008 CTP还是VS2010 Beta1?

在任何情况下,由于 500 响应出现异常,这就是 WebRequest 的工作原理。这是一个简短的演示程序:

open System
open System.ServiceModel
open System.ServiceModel.Web

[<ServiceContract>]
type IMyContract =
[<OperationContract>]
[<WebGet(UriTemplate="/Returns500")>]
abstract Returns500 : unit -> unit
[<OperationContract>]
[<WebGet(UriTemplate="/Returns201")>]
abstract Returns201 : unit -> unit

type MyService() =
interface IMyContract with
member this.Returns500() =
WebOperationContext.Current.OutgoingResponse.StatusCode <-
System.Net.HttpStatusCode.InternalServerError
member this.Returns201() =
WebOperationContext.Current.OutgoingResponse.StatusCode <-
System.Net.HttpStatusCode.Created

let addr = "http://localhost/MyService"
let host = new WebServiceHost(typeof<MyService>, new Uri(addr))
host.AddServiceEndpoint(typeof<IMyContract>, new WebHttpBinding(), "") |> ignore
host.Open()

open System.Net

let url500 = "http://localhost/MyService/Returns500"
let url201 = "http://localhost/MyService/Returns201"
let async_value (url:string) =
async {
let req = WebRequest.Create(url)
let! rsp = req.AsyncGetResponse()
return (rsp :?> HttpWebResponse).StatusCode
}
let status = Async.RunSynchronously(async_value url201)
printfn "%A" status
try
let status = Async.RunSynchronously(async_value url500)
printfn "%A" status
with e ->
printfn "%s" (e.ToString())

关于F# 异步 web 请求,处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1325740/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com