HttpClient无法从UWP应用连接到URL

时间:2018-12-20 19:46:55

标签: c# uwp dotnet-httpclient

首先,我必须承认我不确定是否应该使用Windows.Web.Http.HttpClient或System.Net.Http.HttpClient。看来Windows.Web.Http.HttpClient是实现UWP的方法,但是我都尝试了两次但均未成功。

我希望从URL收到一个JSON对象。当我将URL复制并粘贴到浏览器中时,可以看到JSON对象很好。如果在连接浏览器后不理会缓存,则UWP从缓存中读取没有问题。我使用相同的代码连接到https://jsonplaceholder.typicode.com/todos/1,并且能够从那里检索JSON对象而没有任何问题。这是我的基本尝试:

async void Connect()
    {
        using (Windows.Web.Http.HttpClient httpClient = new Windows.Web.Http.HttpClient())
        {
            Uri uri = new Uri(@"https://www.nottheactualdomainname.com/?api=software-api&email=xxxx@xxxx.com&licence_key=xxxx&request=status&product_id=xxxxinstance=20181218215300");
            Windows.Web.Http.HttpResponseMessage httpResponse = new Windows.Web.Http.HttpResponseMessage();
            string httpResponseBody = "";

            try
            {
                httpResponse = await httpClient.GetAsync(uri);
                httpResponse.EnsureSuccessStatusCode();

                httpResponseBody = await httpResponse.Content.ReadAsStringAsync();

                if (JsonObject.TryParse(httpResponseBody, out JsonObject keyValuePairs))
                {
                    //handle JSON object
                }
                else
                {
                    //didn't recieve JSON object
                }

            }
            catch (Exception ex)
            {
                httpResponseBody = "Error: " + ex.HResult.ToString("X") + " Message: " + ex.Message;
            }
        }
    }

我尝试过在各个方面(包括在using语句之前,在初始化httpResponse之前以及在try语句之前)添加此内容:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

以及(知道我只能在调试时这样做):

//for debugging ONLY; not safe for production
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

有时我会收到此错误:

错误:80131500消息:响应状态代码未指示成功:403()。

和一些我得到这个错误:

错误:80190193消息:禁止(403)。

或两者兼而有之。我已经使用Windows.Web.Http.HttpClient和System.Net.Http.HttpClient进行了尝试。

我最终将需要确保我的URL包含服务器的适当凭据。但是,不正确的凭据应该只返回带有错误信息的JSON,而我没有得到。我可以连接到https://www.nottheactualdomainname.com。接下来我应该检查什么?

1 个答案:

答案 0 :(得分:1)

我找到了答案here

我能够使用浏览器开发人员工具查看请求标头。然后我添加了这个:

httpClient.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36");