.net HttpClient在W10 UAP中不发送相同的请求
我目前正面临一个我认为是System.Net.Http库及其.net HttpClient在W10 UAP中不发送相同的请求,.net,portable-class-library,dotnet-httpclient,windows-10-universal,system.net,.net,Portable Class Library,Dotnet Httpclient,Windows 10 Universal,System.net,我目前正面临一个我认为是System.Net.Http库及其HttpClient类的bug。请注意,我使用的是可移植类库中的HttpClient 如果I userHttpClient.SendAsync执行以下查询:,则.NET执行的查询在UAP中运行时与在控制台应用程序中运行时不同。(查询=Пцццц!) 我已经能够通过Fiddler识别出这一点: 控制台应用程序: 获取HTTP/1.1 用户代理:Tweetinvi/0.9.11.1 缓存控制:没有缓存 授权:OAuth OAuth_cons
HttpClient
类的bug。请注意,我使用的是可移植类库中的HttpClient
如果I userHttpClient.SendAsync
执行以下查询:,则.NET执行的查询在UAP中运行时与在控制台应用程序中运行时不同。(查询=Пцццц!)
我已经能够通过Fiddler识别出这一点:
控制台应用程序:
获取HTTP/1.1
用户代理:Tweetinvi/0.9.11.1
缓存控制:没有缓存
授权:OAuth OAuth_consumer_key=“jjmv4k3n9eswd9hlhrzqczrm”,OAuth nonce=“22222”,OAuth_signature_method=“HMAC-SHA1”,OAuth_timestamp=“1458086400”,OAuth_token=“1693649419-bleivywiirb2jjjjdzripxwp4ltvdo4vlye1vw”,OAuth_version=“1.0”,OAuth_signature=“odauznfxmbm7l0zgefsjr%2BAA%3D”
主持人:api.twitter.com
连接:保持活力
Windows 10通用应用程序:
获取HTTP/1.1
缓存控制:没有缓存
用户代理:Tweetinvi/0.9.11.1
授权:OAuth OAuth_consumer_key=“jjmv4k3n9eswd9hlhrzqczrm”,OAuth nonce=“22222”,OAuth_signature_method=“HMAC-SHA1”,OAuth_timestamp=“1458086400”,OAuth_token=“1693649419-bleivywiirb2jjjjdzripxwp4ltvdo4vlye1vw”,OAuth_version=“1.0”,OAuth_signature=“odauznfxmbm7l0zgefsjr%2BAA%3D”
主持人:api.twitter.com
连接:保持活力
Cookie:guest_id=v1%3A145704170375190067
如果注意,您会注意到在控制台上,查询参数的末尾是%82(带问号)
另一方面,W10查询参数以%82%21结束。在这里,问号保持了它的HTML转义
您还可以注意到W10正在添加cookie
它是.NET Framework/HttpClient库的一个bug吗
我可以保证在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;
}
}
公共类HttpClientWebHelper:IHttpClientWebHelper
{
公共异步任务GetHttpResponse(ITwitterQuery twitterQuery,HttpContent HttpContent=null,ITwitterClientHandler=null)
{
使用(var client=GetHttpClient(twitterQuery,handler))
{
client.Timeout=twitterQuery.Timeout;
var httpMethod=newhttpmethod(twitterQuery.httpMethod.ToString());
if(httpContent==null)
{
返回wait client.SendAsync(新的HttpRequestMessage(httpMethod,twitterQuery.QueryURL)).configurewait(false);
}
其他的
{
if(httpMethod!=httpMethod.Post)
{
抛出新ArgumentException(“无法在非POST的WebRequest中发送HttpContent”);
}
返回wait client.PostAsync(twitterQuery.QueryURL,httpContent).configurewait(false);
}
}
}
公共HttpClient GetHttpClient(ITwitterQuery twitterQuery,ITWitterClient twitterHandler=null)
{
var handler=(twitterHandler作为TwitterClientHandler)??新TwitterClientHandler();
handler.TwitterQuery=TwitterQuery;
var client=新的HttpClient(处理程序)
{
Timeout=twitterQuery.Timeout,
};
返回客户;
}
}
以结束此问题,并向需要更多信息的用户提供一些反馈
我与.NET开发团队进行了讨论,他们一致认为这是一个bug。问题是它们通过System.Uri生成的查询在两个版本中的工作方式不同
您可以通过.NET github上的2个相关问题了解更多信息