gpt4 book ai didi

c# - 在 Ubuntu 上使用带有 Mono 的 HttpWebResponse 清空响应数据

转载 作者:行者123 更新时间:2023-12-04 18:47:40 25 4
gpt4 key购买 nike

我正在尝试使用单声道在 Ubuntu 上运行 .NET 程序。

程序连接到远程服务器 API 并获取 XML 字符串作为响应。
这是负责此任务的函数的简化版本。

 using System.Net;

static string GetProducts(string clientID, string apiKey, string url)
{
HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
req.Credentials = new NetworkCredential(clientID, apiKey);
req.ContentType = "application/x-www-form-urlencoded";

string result = string.Empty;

using (HttpWebResponse resp = req.GetResponse() as HttpWebResponse)
{
StreamReader reader = new StreamReader(resp.GetResponseStream());
result = reader.ReadToEnd();
}

return result;
}

它在我的 Windows 8.1 机器上运行良好。但我的目标是在 Ubuntu VPS 上运行它。
我正在使用单声道来实现这一点。程序运行,但在尝试解析下载的 XML 字符串时异常停止。
[ERROR] FATAL UNHANDLED EXCEPTION: System.Xml.XmlException: Document element did not appear.  Line 1, position 1.

经过一番探索,我发现该程序实际上并没有在 XML 中获得响应,而是产生了一个空字符串。这很奇怪,因为没有抛出连接错误。

我以前在 mono 和 Ubuntu 方面有过一些经验,但以前从未遇到过这样的问题。

这可能与 Ubuntu 服务器或单声道有关吗?还是在代码本身?

对此有什么想法吗?

最佳答案

最后,我找到了问题所在,并找到了解决方案。首先,我在 Perl 中编写了一个简单的代码来查看我的问题所在:在单声道或 linux 服务器本身。

#!/usr/bin/perl 
use LWP::UserAgent 6;
my $ClientID = "id";
my $APIKey = "key";
my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });
my $req = HTTP::Request->new(GET => 'https://server.url');
$req->authorization_basic($ClientID, $APIKey);
my $res = $ua->request( $req );
print "Status: " . $res->status_line . "\n";
print "Contents: ". $res->content . "\n";

Perl 代码有效,在请求状态和打印内容时给了我 OK。但要让它工作,我必须禁用服务器安全检查 LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 }) ,否则将无法正常工作。这让我思考。也许这就是我在 C# 代码中没有得到任何响应数据的原因。因为安全检查失败。经过进一步测试后,我确认这确实是我的情况。我找不到 ssl 安全检查失败的原因,所以我决定完全忽略检查,就像我在 Perl 代码中所做的那样。我做了一些研究,发现了这个线程 How to ignore SSL Certificate check .我刚刚将这段代码添加到我的函数中,它就可以工作了。
System.Net.ServicePointManager.ServerCertificateValidationCallback +=
delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
System.Security.Cryptography.X509Certificates.X509Chain chain,
System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
return true; // **** Always accept
};

我仍然不知道为什么证书检查在 linux 上失败。但至少,通过忽略检查,它可以在 Windows 和 Linux 上运行。这是最终的代码:
using System.Net;

static string GetProducts(string clientID, string apiKey, string url)
{
HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
req.Credentials = new NetworkCredential(clientID, apiKey);
req.ContentType = "application/x-www-form-urlencoded";

System.Net.ServicePointManager.ServerCertificateValidationCallback +=
delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
System.Security.Cryptography.X509Certificates.X509Chain chain,
System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
return true;
};

string result = string.Empty;

using (HttpWebResponse resp = req.GetResponse() as HttpWebResponse)
{
StreamReader reader = new StreamReader(resp.GetResponseStream());
result = reader.ReadToEnd();
}

return result;
}

关于c# - 在 Ubuntu 上使用带有 Mono 的 HttpWebResponse 清空响应数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22918738/

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