【问题标题】:Why F# code yields different result than C#为什么 F# 代码产生与 C# 不同的结果
【发布时间】:2023-03-14 10:23:01
【问题描述】:

为什么这个 C# 代码可以工作,但不是等效的 F# 版本(通过 F# 交互运行)?结果应该是一个只有数字的 HTML 表格。

C# 版本:

    var url = "https://www.investing.com/instruments/HistoricalDataAjax";

    var httpRequest = (HttpWebRequest)WebRequest.Create(url);
    httpRequest.Method = "POST";

    httpRequest.Headers["Origin"] = "http://www.investing.com";
    httpRequest.Headers["X-Requested-With"] = "XMLHttpRequest";
    httpRequest.ContentType = "application/x-www-form-urlencoded";
    httpRequest.UserAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/51.0.2704.79 Chrome/51.0.2704.79 Safari/537.36";

    var data = "curr_id=1073048&smlID=2627117&header=SE0010296574%20Historical%20Data&st_date=04%2F12%2F2020&end_date=05%2F12%2F2021&interval_sec=Daily&sort_col=date&sort_ord=DESC&action=historical_data";

    using (var streamWriter = new StreamWriter(httpRequest.GetRequestStream()))
    {
        streamWriter.Write(data);
    }

    var httpResponse = (HttpWebResponse)httpRequest.GetResponse();
    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
        var result = streamReader.ReadToEnd();
        Console.WriteLine(result);
    }

    Console.WriteLine(httpResponse.StatusCode);

F# 版本:

let url = "https://www.investing.com/instruments/HistoricalDataAjax"
let httpRequest = WebRequest.Create(url) :?> HttpWebRequest
httpRequest.Method <- "POST"
httpRequest.Headers.["Origin"] <- "http://www.investing.com"
httpRequest.UserAgent <- "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/51.0.2704.79 Chrome/51.0.2704.79 Safari/537.36"
httpRequest.Headers.["X-Requested-With"] <- "XMLHttpRequest"
httpRequest.ContentType <- "application/x-www-form-urlencoded"
let data = "curr_id=1073048&smlID=2627117&header=SE0010296574%20Historical%20Data&st_date=04%2F12%2F2020&end_date=05%2F12%2F2021&interval_sec=Daily&sort_col=date&sort_ord=DESC&action=historical_data";
let streamWriter = new StreamWriter(httpRequest.GetRequestStream())
streamWriter.Write(data)
let httpResponse = httpRequest.GetResponse() :?> HttpWebResponse
let streamReader = new StreamReader(httpResponse.GetResponseStream())
let html = streamReader.ReadToEnd()
printfn "%A" httpResponse.StatusCode

【问题讨论】:

标签: c# f# webrequest translate


【解决方案1】:

(更新)

您会得到不同的结果,因为 POST 是在没有正文的情况下发送的。流写入器需要刷新:

( use streamWriter = new StreamWriter(httpRequest.GetRequestStream())
  streamWriter.Write(data) )

【讨论】:

  • 奇怪的是F#代码执行没有错误,但是从服务器获取的数据却不一样!使用 F# 版本,检索网站主页,而 C# 代码检索 HTML 数据表(这是正确的)。我已经复制/粘贴了 URL 和所有请求信息,结果仍然不同,太奇怪了。我现在正在考虑保留 C# 版本并在 F# 中将其作为 DLL 调用,虽然笨重但至少可以工作。
  • 这根本不是什么奇怪的事情。在 C# 代码中,您在发送请求之前关闭 streamWriter,但在 F# 代码中,您没有。代码不同。所以非常期待不同的结果。
  • 为了与 C# 代码更加一致,以下代码也需要更新:( use streamReader = new StreamReader(httpResponse.GetResponseStream()) let result = streamReader.ReadToEnd() printfn "%A" result ) printfn "%A" httpResponse.StatusCode ,请务必注意,否则 F# 与 C# 不同
猜你喜欢
  • 2016-11-13
  • 1970-01-01
  • 2018-08-03
  • 2019-06-23
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
相关资源
最近更新 更多