有人能简单介绍一下HTTP 1.0和HTTP 1.1之间的区别吗?我花了一些时间与两个RFC,但未能在它们之间拉出很多差异.维基百科说:
HTTP/1.1(1997-1999)
当前版本; 默认情况下启用持久连接,并且与代理一起使用.还支持请求流水线操作,允许同时发送多个请求,允许服务器为工作负载做准备,并可能更快地将请求的资源传输到客户端.
但这对我来说并不意味着很多.我意识到这是一个有点复杂的主题,所以我不期待一个完整的答案,但有人可以给我一个较低层次的差异的简要概述吗?
我的意思是,我正在寻找实现HTTP服务器或应用程序所需的信息.我主要是想在正确的方向上轻推一下,这样我就可以自己搞清楚了.
前一段时间我使用HttpClient
该类实现了一些使用REST Api的代码.
using (var client = new HttpClient() { BaseAddress = new Uri(@"https://thirdparty.com") })
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(...);
var uri = new Uri(@"rest/api/foo", UriKind.Relative);
var content = new StringContent(json.ToString());
using (var response = await client.PostAsync(uri, content))
{
// etc ...
}
}
Run Code Online (Sandbox Code Playgroud)
对于测试和生产环境(每个环境都访问测试/生产环境),此代码似乎完全正常.最近,我们开始只在生产环境中获得HttpRequestException :System.Net.Http.HttpRequestException: Error while copying content to a stream.
这看起来有点奇怪,所以我使用Postman发送相同的消息,它工作得很好.我不确定为什么我们的代码失败了,Postman正在工作.我更改了json数据中的参数(状态从"NY"到"NV"),我们的.NET代码运行正常 - 当然我们不能只发送错误的json数据,所以这不是一个解决方案; 这更像是一个观察结果,完全相同的代码在不同内容下运行良好.
有趣的是,我们可以通过两个代码更改来解决这个问题.首先,Postman能够使用该RestSharp
包生成有效的C#代码.或者,我从另一个指向使用HttpVersion 1.0的问题中找到答案:
using (var request = new HttpRequestMessage(HttpMethod.Post, uri))
{
request.Version = HttpVersion.Version10; …
Run Code Online (Sandbox Code Playgroud) 我读过许多 Stack Overflow 问题(例如这个),讨论以下错误消息的变体:
System.Net.Http.HttpRequestException:将内容复制到流时出错。---> System.IO.IOException:无法从传输连接读取数据:现有连接被远程主机强制关闭。
但是,我收到以下错误消息变体:
System.Net.Http.HttpRequestException:将内容复制到流时出错。---> System.IO.IOException:无法从传输连接读取数据:现有连接已关闭。
没有显示“被远程主机强行关闭”。异常消息中没有进一步详细说明关闭连接的确切原因(甚至是客户端还是服务器关闭了连接)。
为什么会发生这种情况?这是否意味着我这边出现了超时或其他问题,或者这是我们供应商方面的问题?(在向我们的供应商提出调查单进行调查之前,我想确定问题是谁的“错”)。
我正在下载的特定文件非常大,可能需要很长时间才能下载。
我的代码是相当“标准”的HttpClient
“获取”逻辑:
private async Task<string> GetReport(string fileNamePrefix, bool lookInCurrentFolder = false, bool returnEntireThing = true)
{
string fileName = $"{fileNamePrefix}-report-{DateTime.Now.ToString("yyyy-MM-dd")}.csv";
string downloadFolder = FileUtilities.GetPath(KnownFolder.Downloads);
string fileInDownloadFolder = Path.Combine(downloadFolder, fileName);
if ((lookInCurrentFolder && !File.Exists(fileName)) || (!lookInCurrentFolder && !File.Exists(fileInDownloadFolder)))
{
HttpClient client = HttpClientConstructor.GetHttpClient(acceptVersion: false, acceptType: "text/csv");
client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
using (HttpResponseMessage msg = await client.GetAsync("analytics/" + fileNamePrefix))
{
using (var fstr = new …
Run Code Online (Sandbox Code Playgroud) 我有一个在IIS上运行的ASP.NET Core 2.0 Web服务.控制器的一种方法或多或少看起来像这样:
[HttpGet()]
public IActionResult Test()
{
// do some db updates and get data
var result = DoSomeStuff();
// serialize data to byte array
var output = Serialize(result);
return File(output, "application/octet-stream");
}
Run Code Online (Sandbox Code Playgroud)
它执行一些数据库更新,从表中查询记录,序列化数据并将其作为响应发送.数据以二进制格式发送.我正在使用MessagePack-CSharp作为序列化程序.
然后我有客户端应用程序与此Web服务进行通信.它是.NET Standard 2.0库,从.NET 4.6.1控制台应用程序引用.我HttpClient
用于请求和HttpResponseMessage.Content.ReadAsByteArrayAsync()
阅读响应(具体代码见下文).
我想做一些测试.我的桌子有cca.80列,包含cca.140000条记录.所有这些都应该发送给客户.从db获取数据需要几秒钟,然后它是序列化的所有内容和cca的结果.34MB发送给客户端.
我有10个客户.当他们连续调用webservice时,一切正常.当我强调web服务和并行启动客户端时,我几乎总是会遇到一些错误(通常有一两个失败,有时甚至是4-5).
以下是例外情况,它是从ReadAsByteArrayAsync
电话中提出的:
System.AggregateException: One or more errors occurred. ---> System.Net.Http.HttpRequestException: Error while copying content to a stream. ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was …
Run Code Online (Sandbox Code Playgroud) 我想用 C# 做一个简单的 HTTP 请求,但有些东西不起作用,我得到的只是403 Forbidden
状态代码。
当我尝试在 Postman 中执行相同的请求时,一切正常。我尝试运行 Fiddler 并查看 Postman 发送的所有标头。我复制粘贴了所有这些,但我仍然收到403 Forbidden
了 C# 代码发送的请求。
public static void Main(string[] args)
{
FlurlHttp.Configure(settings => {
settings.HttpClientFactory = new MyClientFactory();
});
var url = "https://example.com"
.AppendPathSegments(new[] { "v1", "oauth", "accesstoken" })
.SetQueryParam("grant_type", "client_credentials")
.AllowAnyHttpStatus()
.WithBasicAuth("username", "password")
.WithHeaders(new {
User_Agent = "Something/0.4.0 Dalvik/2.1.0 (Linux; U; Android 5.1.1; SM-G975F Build/NRD90M)",
X_Secret_Header = "secret_encoded_value",
accept_encoding = "gzip, deflate",
Accept = "*/*"
});
HttpResponseMessage msg = url.GetAsync().Result; …
Run Code Online (Sandbox Code Playgroud)