.net - HttpClient 不会在 W10 UAP 中发送相同的请求

标签 .net portable-class-library dotnet-httpclient windows-10-universal system.net

我目前正面临我认为是 System.Net.Http 库及其 HttpClient 的错误。类(class)。请注意,我使用的是 HttpClient来自可移植类库。
如果我用户 HttpClient.SendAsync以下查询:https://api.twitter.com/1.1/search/tweets.json?q=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%21&result_type=mixed&count=100 , .NET 执行的查询在 UAP 中运行和在控制台应用程序中运行时是不同的。 (查询 = Привет!)
我已经能够通过 Fiddler 识别出这一点:
控制台应用程序:

GET https://api.twitter.com/1.1/search/tweets.json?q=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82!&result_type=mixed&count=100 HTTP/1.1

User-Agent: Tweetinvi/0.9.11.1

Cache-Control: no-cache

Authorization: OAuth oauth_consumer_key="jjMV4k3n9EswD9hlhRZqQCZrm",oauth_nonce="222222",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1458086400",oauth_token="1693649419-BlEivyWIiOVrb22JjdzRipXWp4ltVdo4VLye1VW",oauth_version="1.0",oauth_signature="ODaUZNfxMbM7l0gtZ1GEFsjr%2BAA%3D"

Host: api.twitter.com

Connection: Keep-Alive


Windows 10 通用应用程序:

GET https://api.twitter.com/1.1/search/tweets.json?q=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%21&result_type=mixed&count=100 HTTP/1.1

Cache-Control: no-cache

User-Agent: Tweetinvi/0.9.11.1

Authorization: OAuth oauth_consumer_key="jjMV4k3n9EswD9hlhRZqQCZrm",oauth_nonce="222222",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1458086400",oauth_token="1693649419-BlEivyWIiOVrb22JjdzRipXWp4ltVdo4VLye1VW",oauth_version="1.0",oauth_signature="ODaUZNfxMbM7l0gtZ1GEFsjr%2BAA%3D"

Host: api.twitter.com

Connection: Keep-Alive

Cookie: guest_id=v1%3A145704170375190067


如果你注意,你会注意到在控制台上,查询参数的结尾是 %82! (带问号)。
另一方面,W10 查询参数以 结束。 %82%21 .这里的问号保持其 HTML 转义。
您还可以注意到 W10 正在添加一个 cookie。
它是 .NET Framework/HttpClient 库的错误吗?
我可以保证输入的查询与 HttpClient.SendAsync 中的相同因为这两个应用程序都使用相同的二进制文件来创建和执行查询(我已验证)。
这是我的代码供引用:
public class HttpClientWebHelper : IHttpClientWebHelper
{
    public async Task<HttpResponseMessage> GetHttpResponse(ITwitterQuery twitterQuery, HttpContent httpContent = null, ITwitterClientHandler handler = null)
    {
        using (var client = GetHttpClient(twitterQuery, handler))
        {
            client.Timeout = twitterQuery.Timeout;

            var httpMethod = new HttpMethod(twitterQuery.HttpMethod.ToString());

            if (httpContent == null)
            {
                return await client.SendAsync(new HttpRequestMessage(httpMethod, twitterQuery.QueryURL)).ConfigureAwait(false);
            }
            else
            {
                if (httpMethod != HttpMethod.Post)
                {
                    throw new ArgumentException("Cannot send HttpContent in a WebRequest that is not POST.");
                }

                return await client.PostAsync(twitterQuery.QueryURL, httpContent).ConfigureAwait(false);
            }
        }
    }

    public HttpClient GetHttpClient(ITwitterQuery twitterQuery, ITwitterClientHandler twitterHandler = null)
    {
        var handler = (twitterHandler as TwitterClientHandler) ?? new TwitterClientHandler();
        handler.TwitterQuery = twitterQuery;

        var client = new HttpClient(handler)
        {
            Timeout = twitterQuery.Timeout,
        };

        return client;
    }
}

最佳答案

为了结束这个问题并向需要更多信息的用户提供一些反馈。

我曾与 .NET 开发团队讨论过,他们一致认为这是一个错误。问题是它们通过 System.Uri 生成的查询在两个版本中的工作方式不同。

您可以通过 .NET github 上的 2 个相关问题了解更多信息。

  • https://github.com/dotnet/corefx/issues/6946
  • https://github.com/dotnet/corefx/issues/11156
  • 关于.net - HttpClient 不会在 W10 UAP 中发送相同的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36025004/

    相关文章:

    c# - C# 中的 swig - 在可移植类库中找不到 HandleRef

    c# - 在 WinPhone 中使用 PCL 中的 System.ComponentModel.DataAnnotations 就像 "microsoft bcl portability pack"一样?

    c# - 使用 HttpClient 的异步 NancyFX - fbcdn 的 GetAsync 返回 403 禁止?

    c# - 是否有替代 IRibbonControl.Context 的解决方法或替代方法来访问 Excel 2016 或更高版本中的正确窗口和工作簿?

    c# - 如何防止 XtraGrid TextEdit 在将光标移动到内容之外时失去焦点

    .net - 在启动之前检查 .NET 依赖项

    .Net 数组的下限 > 0

    visual-studio - Visual Studio 2013 (wp7/win8) 中的可移植类库

    c# - 如何从另一个HttpResponseMessage返回PDF内容到浏览器?

    c# - 使用 FormCollection 中的数据发出异步 HttpClient 发布请求