带有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的主要内容,如果未能解决你的问题,请参考以下文章

UWP:为啥我的后台任务(使用 TimeTrigger)会超出 CPU 配额?

后台任务 UWP - 使用数据传递对象

UWP 后台任务系统关闭

UWP FileWatcher 后台任务

UWP:请求启动后台任务时出错

后台任务不在 UWP 中运行