相关疑难解决方法(0)

HTTP 1.0与1.1

有人能简单介绍一下HTTP 1.0和HTTP 1.1之间的区别吗?我花了一些时间与两个RFC,但未能在它们之间拉出很多差异.维基百科说:

HTTP/1.1(1997-1999)

当前版本; 默认情况下启用持久连接,并且与代理一起使用.还支持请求流水线操作,允许同时发送多个请求,允许服务器为工作负载做准备,并可能更快地将请求的资源传输到客户端.

但这对我来说并不意味着很多.我意识到这是一个有点复杂的主题,所以我不期待一个完整的答案,但有人可以给我一个较低层次的差异的简要概述吗?
我的意思是,我正在寻找实现HTTP服务器或应用程序所需的信息.我主要是想在正确的方向上轻推一下,这样我就可以自己搞清楚了.

http http-1.0 http-1.1

247
推荐指数
5
解决办法
20万
查看次数

HttpRequestException - 这是客户端还是服务器问题?

前一段时间我使用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)

c# rest json dotnet-httpclient postman

22
推荐指数
1
解决办法
2987
查看次数

RESTful Web 服务调用中“无法从传输连接读取数据:现有连接已(非强制)关闭”

我读过许多 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)

.net c# dotnet-httpclient

8
推荐指数
1
解决办法
5万
查看次数

HttpClient和ASP.NET Core 2.0 Web服务之间的连接已关闭错误

我有一个在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)

.net c# iis dotnet-httpclient asp.net-core-2.0

6
推荐指数
1
解决办法
5364
查看次数

HTTP 请求适用于 Postman,但不适用于 C# 代码

我想用 C# 做一个简单的 HTTP 请求,但有些东西不起作用,我得到的只是403 Forbidden状态代码。

当我尝试在 Postman 中执行相同的请求时,一切正常。我尝试运行 Fiddler 并查看 Postman 发送的所有标头。我复制粘贴了所有这些,但我仍然收到403 Forbidden了 C# 代码发送的请求。

C# 代码(使用https://fluurl.dev):

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)

c# http request postman flurl

5
推荐指数
5
解决办法
9009
查看次数