带有json字符串的后台任务中的UWP Httpclient postasync
Posted
技术标签:
【中文标题】带有json字符串的后台任务中的UWP Httpclient postasync【英文标题】:UWP Httpclient postasync in background task with json string 【发布时间】:2016-08-31 22:22:01 【问题描述】:我只是想从我的 UWP 应用程序的后台任务中将一些 json 发布到 api 并取回响应以将其读出。我的后台任务不断失败
Platform::DisconnectedException ^ 在内存位置 0x077FEE74。
我尝试了很多方法让它与互联网上的东西一起工作,但只是稍微调整了失败。不用代码我也能完美执行后台任务。
代码如下:
public async void Run(IBackgroundTaskInstance taskInstance)
_deferral = taskInstance.GetDeferral();
HttpClient aClient = new HttpClient();
aClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
aClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/javascript"));
Uri theUri = new Uri("https://m.xxxx.com/api/v4/session?expand=account,profile)");
StringContent theContent = new StringContent(" \"keep_login\": true, \"id\": null, \"username\": \"zumbauser\", \"password\": \"zumbapw\" ", Encoding.UTF8, "application/json");
HttpResponseMessage aResponse = await aClient.PostAsync(theUri, theContent);
if (aResponse.IsSuccessStatusCode)
Debug.WriteLine("This is outpuuuuuuuuuuuuuut: " + aResponse.ToString());
else
// show the response status code
String failureMsg = "HTTP Status: " + aResponse.StatusCode.ToString() + " – Reason: " + aResponse.ReasonPhrase;
_deferral.Complete();
我试图模仿的 Json 看起来像这样:
"keep_login":null,"id":null,"username":"zumbauser","password":"zumbapw"
感谢任何帮助!
【问题讨论】:
您要调用哪个 Web API? 我正在使用 system.net.http 因为 StringContent 仅适用于此。如何为 Windows.web.http 重写它? 【参考方案1】:最好将windows.web.http.httpclient 用于 UWP 应用程序,因为它支持多种语言。见表来自reference
现在是字符串内容。 Windows.Web.HttpClient 作为 HttpStringContent 类似于 System.Net.Http.HttpClient
中的 StringContent
这是一个 sn-p 示例,但请务必阅读参考资料。
Uri theUri = new Uri("https://m.xxxx.com/api/v4/session?expand=account,profile)");
HttpStringContent content = new HttpStringContent(" \"keep_login\": true, \"id\": null, \"username\": \"zumbauser\", \"password\": \"zumbapw\" ", Windows.Storage.Streams.UnicodeEncoding.Utf8, "application/json");
var client = new HttpClient();
HttpResponseMessage response = await client.PostAsync(theUri, content);
所以要完成你的方法,它将是
public async void Run(IBackgroundTaskInstance taskInstance)
_deferral = taskInstance.GetDeferral();
HttpClient aClient = new HttpClient();
aClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
aClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/javascript"));
Uri theUri = new Uri("https://m.xxxx.com/api/v4/session?expand=account,profile)");
HttpStringContent content = new HttpStringContent(" \"keep_login\": true, \"id\": null, \"username\": \"zumbauser\", \"password\": \"zumbapw\" ", Windows.Storage.Streams.UnicodeEncoding.Utf8, "application/json");
HttpResponseMessage aResponse = await aClient.PostAsync(theUri, content);
if (aResponse.IsSuccessStatusCode)
Debug.WriteLine("This is outpuuuuuuuuuuuuuut: " + aResponse.ToString());
else
String failureMsg = "HTTP Status: " + aResponse.StatusCode.ToString() + " – Reason: " + aResponse.ReasonPhrase;
_deferral.Complete();
注意:我在后台任务中对我的一个 APP 进行了同样的尝试,它运行良好。唯一失败的情况是当我尝试发送大量数据时出现可用内存不足错误。
祝你好运,编码愉快。
【讨论】:
谢谢。现在尝试变体。 “MediaTypeWithQualityHeaderValue”虽然也是 system.net.http api 的一部分。 VS2015 建议我将其更改为 Windows.Web.Http.Headers.HttpMediaTypeWithQualityHeaderValue。将报告... 抛出异常:mscorlib.ni.dll 中的“System.IO.FileLoadException”程序“[14704] backgroundTaskHost.exe”已退出,代码为 1 (0x1)。这就是我添加代码时得到的全部。没有代码它运行良好。 :( 似乎还有其他问题... 您是从此处的文件中加载内容吗? 没有。没有。这就是奇怪的部分。除了代码之外,后台任务完全是空的。它与需要特定内存访问的流有关吗? 您是否使用 Newtonsoft Json 从 Class 对象序列化 Json?如果是,则尝试卸载该软件包并安装它。大约 2 个月前我遇到了同样的问题,这样做解决了我的问题。【参考方案2】:我知道这听起来可能很傻,但是您使用的是哪个HttpClient
?来自System.Net.Http
的那个还是来自Windows.Web.Http
的那个?换一个试试,可能会有帮助
【讨论】:
我正在使用 system.net.http 因为 StringContent 仅适用于此。如何为 Windows.web.http 重写它?以上是关于带有json字符串的后台任务中的UWP Httpclient postasync的主要内容,如果未能解决你的问题,请参考以下文章