HttpClient 不会在 W10 UAP 中发送相同的请求
HttpClient does not send same request in W10 UAP
我目前正面临我认为是 System.Net.Http 库及其 HttpClient
class 的错误。请注意,我使用的是便携式 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 上的 2 个相关问题了解更多信息 github。
我目前正面临我认为是 System.Net.Http 库及其 HttpClient
class 的错误。请注意,我使用的是便携式 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 上的 2 个相关问题了解更多信息 github。