Фоновая задача Windows Phone - использование HttpWebRequest или WebClient

Мне нужно отправить информацию на сервер с помощью WCF. В настоящее время я использую WebClient для вызова WCF с данными json. Теперь с фоновой задачей я вызываю тот же WCF с json, но функция обратного вызова UploadStringAsync никогда не вызывается. Я также пробовал HttpWebRequest, но он тоже не работает.

Я вижу в документации, что HttpWebRequest поддерживается в фоновых задачах.

Ниже приведен код, обрабатывающий запрос / ответ WCF:

public class Communication
{
    #region Private Variables

    /// <summary>
    /// Callback method passed to MakeHttpPostRequest will be set to below variable. 
    /// This variable holds the reference to callback function and used to invoke the method passed by MakeHttpPostRequest calling method.
    /// </summary>
    private Action<string> action;

    private Action<string, object> genericAction;

    private object returnValue;

    #endregion

    #region Methods

    /// <summary>
    /// Calls WCF service using POST method.
    /// </summary>
    /// <param name="webserviceURL">URL of WCF service.</param>
    /// <param name="json">JSON data to be posted to WCF service.</param>
    /// <param name="response">Callback function that is invoked when response is received from WCF service.</param>
    public void MakeHttpPostRequest(string webserviceURL, string json, Action<string> response)
    {
        try
        {
            this.action = response;

            if (DeviceNetworkInformation.IsNetworkAvailable)
            {
                Uri uri = new Uri(webserviceURL);
                byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(json);

                string data = Encoding.UTF8.GetString(byteArray.ToArray(), 0, (int)byteArray.Length);
                WebClient webClient = new WebClient();
                webClient.UploadStringCompleted += new UploadStringCompletedEventHandler(this.WebClient_UploadStringCompleted);
                webClient.Headers["Content-type"] = "application/json";
                webClient.Encoding = Encoding.UTF8;
                webClient.UploadStringAsync(uri, "POST", data);
            }
            else
            {
                if (this.action != null)
                {
                    this.action(string.Empty);
                }
            }
        }
        catch (Exception ex)
        {
            if (this.action != null)
            {
                this.action(string.Empty);
            }

            new ErrorException.ErrorException().HandleError(ex, string.Empty, Global.Modules.General);
        }
    }

    #endregion

    #region Events

    /// <summary>
    /// Callback function that gets called when response is received from web service.
    /// </summary>
    /// <param name="sender">The object that raises the event.</param>
    /// <param name="e">Object containing Http response details.</param>
    private void WebClient_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
    {
        try
        {
            // Check whether to invoke any method
            if (this.action != null)
            {
                // Invoke the method passed to MakeHttpPostRequest by it's calling method
                this.action(e.Result);
            }
            else if (this.genericAction != null)
            {
                // Invoke the method passed to MakeHttpPostRequest by it's calling method
                this.genericAction(e.Result, this.returnValue);
            }
        }
        catch (Exception ex)
        {
            if (this.action != null)
            {
                this.action(string.Empty);
            }

            new ErrorException.ErrorException().HandleError(ex, string.Empty, Global.Modules.General);
        }
    }

    #endregion
}

И используя приведенный ниже код для отправки json на сервер:

// Send location data to server
new Common.Communication().MakeHttpPostRequest(Common.ServiceURL.TrackingTracingURL, postData, result);

Приведенный выше код работает нормально из приложения. Но не работает при вызове из фоновой задачи.


Не было никаких проблем с HttpWebRequest или WebClient. Не удалось позвонить:

NotifyComplete();

Поскольку вызовы HttpWebRequest или WebClient являются асинхронными, вызов NotifyComplete (); прерывал выполнение фоновой задачи до получения ответа и не ждал ответа HttpWebRequest или WebClient.

Есть ли у кого-нибудь обходной путь для этого?


person Ramesh Patel    schedule 06.09.2011    source источник
comment
Из msdn.microsoft.com/en-us/ library / hh202942 (v = vs.92) .aspx - Периодические агенты обычно работают в течение 25 секунд: может быть, ваш вызов занимает больше времени?   -  person Paul Annetts    schedule 06.09.2011
comment
Можете ли вы показать свой код, который вызывает сервер из фонового агента?   -  person Chris Sainty    schedule 07.09.2011
comment
Пожалуйста, просто отредактируйте свой вопрос, чтобы добавить дополнительную информацию. Ответы предназначены только для этого, а не для обсуждения или разъяснения (однако для этого можно использовать комментарии под ответами).   -  person Tim Post♦    schedule 08.09.2011


Ответы (1)


Как Павел упомянул в своем комментарии, вполне вероятно, что ваша фоновая задача завершается после 25 секунд бездействия. Если ваша задача принудительно завершается 3 (?) Раза, она будет незапланированной до тех пор, пока ваше приложение не планирует ее снова (я считаю, что они также могут получить постоянный бан, если это будет продолжаться, но я не уверен в этом на 100%).

Изменить

NotifyComplete(); может происходить в асинхронном обратном вызове. Просто переместите его в конец вашего обратного вызова после того, как вы закончите обработку ответа.

person Richard Szalay    schedule 06.09.2011
comment
Ты, парень, спаси мне день! - person Thibault Gandon; 13.04.2016