【问题标题】:Equivalent of HttpClient in .NET Core 2.2?.NET Core 2.2 中的 HttpClient 等价物?
【发布时间】:2019-12-26 02:56:01
【问题描述】:

我人生中第一次尝试切换到 Linux,但我在那里的 C# 应用程序有点挣扎。

我正在制作一个应用程序,它每 60 秒抓取一次网站,将整个 html 代码保存在一个名为“original”的变量中,然后在每次运行后进行比较。如果网站的 html 代码有任何变化,它会向我的 Telegram 聊天发送一条消息,说“Hello world”。

我已经删除了我的凭据和资料,但这就是代码的样子。由于 .NET Core 2.2 中不存在 HttpClient(这是迄今为止我能够在 Linux 上安装的唯一一个(Ubuntu,我在 AWS EC2 和带有 XFCE 的远程桌面上)。我对 Linux 也完全陌生。我确实看到 .NET Core 3 已经发布,但我似乎无法安装它(我做错了什么吗?)。我也不知道 HttpClient 是否包含在其中。

无论如何;有什么方法可以用其他东西代替 HttpClient 来将我的 PostAsync 发送到 Telegram 的 API?

using System;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net;
using System.Collections.Generic;

namespace MyApp
{
    class Program
    {
        private static readonly HttpClient httpclient = new HttpClient();
        private static readonly WebClient client = new WebClient();
        public static string original = "";
        static void Main(string[] args)
        {
            Task.Run(async () =>
            {
                while (true)
                {
                    await Task.Delay(60000);
                    string result = client.DownloadString("https://website.com");
                    if (original != result && original != "")
                    {
                        Dictionary<string, string> inputData = new Dictionary<string, string>
                        {
                            { "chat_id", "x" },
                            { "text", "Hello world" }
                        };

                        var request = await httpclient.PostAsync("https://api.telegram.org/botxxxx/sendMessage", new FormUrlEncodedContent(inputData));
                        Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " Apartment listings were updated.");
                    }
                    else
                    {
                        Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " No change in apartment listings.");
                    }

                    original = result;

                }
            });

            Console.Read();
        }
    }
}

错误信息:

Program.cs(5,18): error CS0234: The type or namespace name `Http' does not exist in the namespace `System.Net'. Are you missing `System.Net.Http' assembly reference?
Program.cs(21,33): error CS0246: The type or namespace name `HttpClient' could not be found. Are you missing an assembly reference?
Compilation failed: 2 error(s), 0 warnings

我只是用mcs Program.cs编译然后用mono Program.exe运行它

编辑:

解决方案:我不必构建它。我可以使用以下命令简单地运行它(无需对上述代码进行任何更改):dotnet run

效果很好!

【问题讨论】:

    标签: c# .net linux post httpclient


    【解决方案1】:

    正如 TheYellowSquares 提到的,HttpClient 确实存在于 .Net Core 2.2 中(您可以在此处看到它,例如 https://github.com/dotnet/corefx/blob/1284396e317e5e7146135b0ba5088741705122e6/src/System.Net.Http/src/System/Net/Http/HttpClient.cs),唯一的事情是您不需要添加任何特定的包。

    您发布的代码 sn-p 应该可以在 Windows 和 Linux 上正确编译。只需使用命名空间 System.Net.Http(已经在您的代码 sn-p 中)就足够了。

    -- 更新

    使用dotnet build 构建项目(检查您是否在项目目录中)

    【讨论】:

    • 它似乎不起作用。您如何在 Linux 上亲自编译代码? mcs 命令不正确吗?我在我的 C# 项目文件夹中打开一个终端,然后运行 ​​mcs Program.cs 然后 mono Program.exe 运行它。
    • 改用dotnet build
    • 它构建了一个“可执行文件”,尽管没有文件扩展名。当我尝试运行它时(双击它,或者运行mono 命令,什么都没有发生)。但它确实构建并发布了大量文件
    • 它现在可以使用命令:dotnet run --project MyApp.csproj "$1" - 它没有构建任何东西。但我可以运行它!所以看起来dotnet 命令是要走的路。使用 mcs 似乎仅限于比 2.0 更早的东西......
    • 嗯,构建过程的输出文件中应该是文件.dll 运行dotnet &lt;YourProjectname&gt;.dll 启动程序
    【解决方案2】:

    .net core中确实存在Httpclient,但我相信你可能需要下载一个nuget包。

    尤其是 Microsoft.AspNetCore.Http。

    【讨论】:

    • 我尝试通过 nuget 安装它,它通过了,但是我在编译时遇到了同样的错误。当我提到using Microsoft.AspNetCore.Http; 时,我得到另一个错误,无法找到它。你确定我应该为这个控制台应用程序使用 Asp .NET?
    • 我现在意识到如何在 Linux 终端中添加对 DLL 的引用。我运行命令mcs /reference:System.Net.Http.dll Program.cs,它编译得很好(我将dll与.cs文件放在同一个文件夹中)。但是当我运行时,我得到了这个错误:System.InvalidProgramException: Invalid IL code in System.Net.Http.HttpClient:.ctor (): method body is empty. 知道如何解决吗?
    • 我可能会尝试全新安装?否则我不确定,抱歉,我无法提供更多帮助。您可能缺少某种 linux 依赖项。如果您通过谷歌查看,有一些方法可以验证/检查是否所有这些都已安装。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2020-10-05
    • 1970-01-01
    相关资源
    最近更新 更多