在Metro应用程序的背景服务中发送和接收Web请求 [英] Send and receive web request in backgroud service of metro app

查看:85
本文介绍了在Metro应用程序的背景服务中发送和接收Web请求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我正在开发都会在后台服务中发送Web请求但未获得Web响应的Metro应用程序.我这样编码:


私有无效的SendRequest(字符串url,Action< string> OnResponse,字符串requestParameter)
{


HttpWebRequest request =(HttpWebRequest)WebRequest.Create(new Uri(url));
request.Method ="POST";
request.ContentType ="text/xml";


request.BeginGetRequestStream(delegate(IAsyncResult req)
{
var outStream = request.EndGetRequestStream(req);

使用(StreamWriter w = new StreamWriter(outStream))
w.Write(requestParameter);

request.BeginGetResponse(delegate(IAsyncResult结果)
{
试试
{
HttpWebResponse响应=(HttpWebResponse)request.EndGetResponse(result);

使用(var stream = response.GetResponseStream())
{
使用(StreamReader reader = new StreamReader(stream))
{
字符串response1 = reader.ReadToEnd();
OnResponse(response1);
}
}
}
catch(ex ex例外)
{
}
},null);
},null);

}

我也这样尝试过

HttpClient客户端=新的HttpClient();
HttpContent内容=新的StringContent(requestParameter);
content.Headers.ContentType =新的System.Net.Http.Headers.MediaTypeHeaderValue("text/xml");
HttpResponseMessage response =等待client.PostAsync(url,content);

是否有任何原因导致我没有得到答复或任何其他方法来执行此操作.我在正常执行时执行了相同的代码,并且可以完美运行,但在后台服务中却不能.

Hi,

I am working on a metro app in which I am sending a web request in background service but not getting web response. I coded like this:


private void SendRequest(string url, Action<string> OnResponse, string requestParameter)
{


HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));
request.Method = "POST";
request.ContentType = "text/xml";


request.BeginGetRequestStream(delegate(IAsyncResult req)
{
var outStream = request.EndGetRequestStream(req);

using (StreamWriter w = new StreamWriter(outStream))
w.Write(requestParameter);

request.BeginGetResponse(delegate(IAsyncResult result)
{
try
{
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);

using (var stream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream))
{
string response1 = reader.ReadToEnd();
OnResponse(response1);
}
}
}
catch (Exception ex)
{
}
}, null);
}, null);

}

I also tried like this

HttpClient client = new HttpClient();
HttpContent content = new StringContent(requestParameter);
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/xml");
HttpResponseMessage response = await client.PostAsync(url, content);

Is there any reason why I am not getting response or any other method to do this. I executed the same code in normal execution and works perfect but not in background service.

推荐答案



只需添加两行,现在就可以正常工作.在后台服务的起点创建一个BackgroundTaskDeferral类的实例,并在您认为这是最后一个任务的地方调用其complete方法.

私人BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();

_deferral.Complete();

实际上发生的是异步调用未调用.后台服务只是在执行代码,并不等待异步调用.因此,通过使用延迟,它会通知服务也有一些异步调用,而complete方法会通知一切将完成.
Hi ,

It was just two lines to add and its working now. Create an instance of BackgroundTaskDeferral class at start point of background service and call its complete method where you think that this was the last task.

private BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();

_deferral.Complete();

Actually what was happening is async calls are not invoking. Background service is just executing code and does not wait for async calls. So by using deferral it notifies service that there are some async calls also and complete method notifies that everything gonna complete.


这篇关于在Metro应用程序的背景服务中发送和接收Web请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆