Получите http 500 в HTTP-запросе рабочей роли Azure.

У меня есть лазурная веб-служба, в которой запущена 1 рабочая роль и 1 веб-роль, роли установлены в частной сети лазури.

Рабочая роль выполняет некоторую работу по синхронизации с нашей базой данных, которая загружает файлы отчетов со многих API и серверов, а затем синхронизирует их с нашей базой данных. По какой-то причине 1 (из 10) HTTP-запрос API возвращает ошибку HTTP 500 в облаке, но когда я отлаживаю его на своей машине, он работает, а также у меня есть тот же код, работающий на веб-сайте aspx EC2 (AWS), который делает то же самое с базой данных, работающей на AWS, которая работает хорошо.

Вот код, который выполняет эту задачу (тот, который терпит неудачу):

public void GenerateReport(DateTime start, DateTime end)
        {
            string URL = this._cj_url;
            URL = string.Format(URL, start.ToString("yyyy-MM-dd"), end.ToString("yyyy-MM-dd"));
            RequestState myRequestState = new RequestState();
            myRequestState.request = (HttpWebRequest)WebRequest.Create(URL);
            myRequestState.from = start;
            myRequestState.to = end;
            myRequestState.prefix = "CJ";
            myRequestState.ext = "xml";

            try
            {
                myRequestState.request.Headers.Add("authorization:" + _devKey);
                myRequestState.request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1";

                HttpWebRequest myHttpWebRequest = myRequestState.request;
                myRequestState.response = (HttpWebResponse)myHttpWebRequest.GetResponse();

                // Read the response into a Stream object.
                Stream responseStream = myRequestState.response.GetResponseStream();
                myRequestState.streamResponse = responseStream;

                //' Get response  
                myRequestState.response = (HttpWebResponse)myRequestState.request.GetResponse();


                //' Get the response stream into a reader  
                StreamReader reader = new StreamReader(myRequestState.response.GetResponseStream());
                this.allFileRows = reader.ReadToEnd();

            }
            catch (Exception e1)
            {
                this.monitor.PushToErrors("CJ - error in downloading the file - " , e1,true);
            }

        }

Вот класс RequestState:

public class RequestState
    {
        // This class stores the State of the request.
        const int BUFFER_SIZE = 1024;
        public StringBuilder requestData;
        public byte[] BufferRead;
        public HttpWebRequest request;
        public HttpWebResponse response;
        public Stream streamResponse;
        public DateTime from;
        public DateTime to;
        public string prefix;
        public string ext;

        public RequestState()
        {
            BufferRead = new byte[BUFFER_SIZE];
            requestData = new StringBuilder("");
            request = null;
            streamResponse = null;
        }
    }

И это URL-адрес, к которому обращается запрос:

this._cj_url = "https://commission-detail.api.cj.com/v3/commissions?date-type=posting&start-date={0}&end-date={1}";

РЕДАКТИРОВАТЬ :

По какой-то причине после того, как я включил удаленное управление экземплярами службы, оно было исправлено. Я действительно задаюсь вопросом, как вышло, что у меня возникла эта проблема...


person Matan L    schedule 16.06.2013    source источник
comment
Что за ошибка/исключение?   -  person haim770    schedule 16.06.2013
comment
1) А внутри ответа нет больше подробностей, кроме кода 500? 2) Если обе роли в одном деплое, то сеть не нужна, можно настроить внутренние точки доступа. 3) Знаете ли вы, что у вас нет гарантированного времени безотказной работы ваших машин только с одним экземпляром на роль?   -  person user1908061    schedule 16.06.2013
comment
1. Это ошибка. Удаленный сервер вернул ошибку: (500) Внутренняя ошибка сервера. 2. Роли должны взаимодействовать с другой виртуальной машиной, которая находится в этой сети, поэтому я установил их в этой сети. 3. да я в курсе, они делают очень простую и не очень масштабную работу.   -  person Matan L    schedule 16.06.2013


Ответы (1)


Одна мысль состоит в том, что когда вы запускаете свой код в облаке, вы работаете на их серверах, а это означает, что все ваши даты могут быть не в порядке. Я видел это раньше, когда вы предполагали, что DateTime.Now (или что вы делаете) — это ваше время, но на самом деле это время сервера виртуальной машины, на которой вы работаете в облаке. Причина, по которой это может быть проблема с датой, заключается в том, что я вижу, что вы передаете параметры даты в URL-адрес, возможно, они неправильно отформатированы, когда вы работаете в облаке?

person Mark    schedule 17.06.2013
comment
ну, я думал об этом, но диапазон дат для этого запроса не может быть неверным, независимо от того, какое время на сервере... - person Matan L; 17.06.2013
comment
можете ли вы зарегистрировать ТОЧНЫЕ данные HTTP-запроса до последней детали и попытаться реплицировать локально? - person Mark; 19.06.2013