Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net HttpClient在W10 UAP中不发送相同的请求_.net_Portable Class Library_Dotnet Httpclient_Windows 10 Universal_System.net - Fatal编程技术网

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

.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

我目前正面临一个我认为是System.Net.Http库及其
HttpClient
类的bug。请注意,我使用的是可移植类库中的
HttpClient

如果I user
HttpClient.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个相关问题了解更多信息