Отправить httpwebrequest в Расписание / Фоновый агент
Я пытаюсь отправить http web request
из background agent
, Код как ниже. json_Callback
никогда не срабатывает, и мой запрос не достигает сервера. Я сделал всю обработку исключений, и ни одно из них не сработало.
Как отправить веб-запрос в фоновом агенте?
protected override void OnInvoke(ScheduledTask task)
{
string toastMessage = "Testing Push running.";
ShellToast toast = new ShellToast();
toast.Title = "Background Agent Sample";
toast.Content = toastMessage;
toast.Show();
try
{
string token = "no token";
appSettings.TryGetValue("newToken", out token);
toastMessage = "New Push running.";
toast = new ShellToast();
toast.Title = "Background Agent Sample";
toast.Content = token;
toast.Show();
if (!String.IsNullOrEmpty(token))
postTokenToServer(token);
_event = new ManualResetEvent(false);
_event.WaitOne();
}
catch (Exception e)
{
toastMessage = e.Message;
toast = new ShellToast();
toast.Title = "a";
toast.Content = toastMessage;
toast.Show();
}
#if DEBUG_AGENT
ScheduledActionService.LaunchForTest(
task.Name, TimeSpan.FromSeconds(1));
#endif
toast = new ShellToast();
toast.Title = "task complete";
toast.Show();
NotifyComplete();
}
private void postTokenToServer(string token)
{
ShellToast toast = new ShellToast();
toast.Title = "is net available";
toast.Content = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable().ToString();
toast.Show();
if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
{
HttpWebRequest req = HttpWebRequest.Create(new Uri(BASE + "/account/device")) as HttpWebRequest;
req.Headers["Cookie"] = "user=" + appSettings["token"] + ";uid=" + (string)appSettings["uid"];
toast.Title = "Cookies token";
toast.Content = (string)appSettings["token"];
toast.Show();
toast.Title = "uid";
toast.Content = (string)appSettings["uid"];
toast.Show();
req.Method = "POST";
req.ContentType = "application/json";
req.BeginGetRequestStream(new AsyncCallback(setParams_Callback), req);
}
else
_event.Set();
}
private void setParams_Callback(IAsyncResult result)
{
string uri = "no token";
appSettings.TryGetValue("newPushToken", out uri);
var req = (HttpWebRequest)result.AsyncState;
Stream postStream = req.EndGetRequestStream(result);
JObject data = new JObject();
data.Add("dev_token", uri);
data.Add("dev_type", "windows");
ShellToast toast = new ShellToast();
toast.Title = "Posting Now";
toast.Content = data.ToString(Newtonsoft.Json.Formatting.None);
toast.Show();
using (StreamWriter sw = new StreamWriter(postStream))
{
string json = data.ToString(Newtonsoft.Json.Formatting.None);
sw.Write(json);
}
postStream.Close();
try
{
req.BeginGetResponse(new AsyncCallback(json_Callback), req);
}
catch(Exception e)
{
toast.Title = "Posting Error";
toast.Content =e.Message;
toast.Show();
_event.Set();
}
toast.Title = "Posted";
toast.Content = DateTime.UtcNow.ToShortTimeString();
toast.Show();
}
private void json_Callback(IAsyncResult result)
{
ShellToast toast = new ShellToast();
toast.Title = "completed";
toast.Show();
_event.Set();
}
1 ответ
Не уверен, поможет ли это вам или нет, но вот как я делаю HTTP-запросы в моем фоновом агенте:
Посылка вызова с использованием WebClient
(это было написано до того, как стал доступен очень красивый пакет HttpClient NuGet):
public async Task<string> GetArrivalsAsync( IEnumerable<int> locations )
{
var request = new WebClient();
var requestUri = GetArrivalsRequestUri( locations );
var response = await request.DownloadStringTask( requestUri );
return response;
}
Обратите внимание, что здесь я использую ключевые слова async / await, что значительно упрощает написание асинхронного кода. Большая часть работы выполняется в этом методе расширения WebClient
, Я не могу взять кредит на метод расширения, но это было какое-то время, и я не могу вспомнить, где я его нашел (хотя, возможно, это было здесь, в Stackru):
/// <summary>
/// The WebClientExtensions class provides extension methods for the <see cref="System.Net.WebClient"/> class.
/// </summary>
public static class WebClientExtensions
{
/// <summary>
/// This extension method is used to asynchronously download data from a URI
/// and return that data in the form of a string.
/// </summary>
/// <param name="webClient">The <see cref="System.Net.WebClient"/> instance used to perform the download.</param>
/// <param name="uri">The URI to download data from.</param>
/// <returns>The <see cref="Task"/> used to perform the operation.</returns>
public static Task<string> DownloadStringTask( this System.Net.WebClient webClient, Uri uri )
{
if ( uri == null )
{
throw new ArgumentNullException( "uri" );
}
var tcs = new TaskCompletionSource<string>();
webClient.DownloadStringCompleted += ( s, e ) =>
{
if ( e.Error != null )
{
tcs.SetException( e.Error );
}
else
{
tcs.SetResult( e.Result );
}
};
webClient.DownloadStringAsync( uri );
return tcs.Task;
}
}