API смешивает данные с разных устройств - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть API, в котором есть устройства, запускающие данные одновременно или в течение нескольких миллисекунд. Я обнаружил, что данные перепутаны. Данные отправляются каждые пять минут (на часах 05, 10, 15 и т. Д.). У меня есть фильтр выполнения, который перехватывает поступающие данные URL, поэтому у меня всегда есть реальный источник, затем он отправляется в конечную точку и затем на обработку. Например, будет отсутствовать случайный пятиминутный период. Когда я отлаживаю шаг за шагом с отсутствующим URL из фильтра выполнения, он работает нормально. Я имею в виду, что я беру URL и отлаживаю, а затем вставляю.

Таким образом, у меня есть идентификатор устройства 1 и идентификатор устройства 2. Я получу пропущенные интервалы, хотя я вижу, что данные попали в фильтр выполнения.

Я предполагаю, что API не обрабатывает их как отдельные транзакции, а каким-то образом смешивает их вместе, следовательно, отсутствуют данные и появляются серийные номера в неправильном месте, так что данные с идентификатора 1 появляются в идентификаторе идентификатора 2 и т. д.

Конечная точка API:

public class SomeController : ApiController
    {          
        [HttpGet]       
        [ExecutionFilter]   
        public async Task<HttpResponseMessage> Get([FromUri] FixedDataModel fdm)
        {
            var reply = new HttpResponseMessage();
            string url = HttpUtility.UrlDecode(HttpContext.Current.Request.QueryString.ToString());

            if (url.Contains("timestamp"))
            {
                reply = TimeSyncValidation.TimeSync;
                return reply;
            }
            else if (!url.Contains("timestamp"))
            {                
                reply = await Task.Run(() => DeviceClass.DeviceApiAsync(fdm, url));               
            }

            return reply;
        }       
    }

Класс обработки:

namespace API.Services
{
    public class DeviceClass
    {
        private static string serialNumber;
        private static byte chk;
        private static string channelName, channelReadingNumber, channelValue, queryString, readingDate;
        private static int colonPosition, chanCountFrom, equalsPosition;
        private static bool checkSumCorrect;

        public static HttpResponseMessage DeviceApiAsync(FixedDataModel fdm, string urlQqueryString)
        {
            Guid guid = Guid.NewGuid();
            //ExecutionTrackerHandler.Guid = guid;

            //Remove question mark
            var q = urlQqueryString;
            queryString = q.Substring(0);

            var items = HttpUtility.ParseQueryString(queryString);
            serialNumber = items["se"];

            //Store raw uri for fault finding
            var rawUri = new List<RawUriModel>
            {
                new RawUriModel
                {
                    UniqueId = guid,
                    RawUri = q,
                    TimeStamp = DateTime.Now
                }
            };

            //Checksum validation
            chk = Convert.ToByte(fdm.chk);

            checkSumCorrect = CheckSumValidator.XorCheckSum(queryString, chk);
            if (!checkSumCorrect)
            {
                return ValidationResponseMessage.ResponseHeaders("Checksum");
            }

            //Create list of items that exist in URL
            var urldata = new UrlDataList
            {
                UrlData = queryString.Split('&').ToList(),
            };

            var data = new List<UriDataModel>();

            //Split the URL string into its parts
            foreach (var item in urldata.UrlData)
            {
                colonPosition = item.IndexOf(":");
                chanCountFrom = colonPosition + 1;
                equalsPosition = item.LastIndexOf("=");

                if (colonPosition == -1)
                {
                    channelName = item.Substring(0, equalsPosition);
                    channelReadingNumber = "";
                    channelValue = item.Substring(item.LastIndexOf("=") + 1);
                }
                else
                {
                    channelName = item.Substring(0, colonPosition);
                    channelReadingNumber = item.Substring(chanCountFrom, equalsPosition - chanCountFrom);
                    channelValue = item.Substring(item.LastIndexOf("=") + 1);

                    if (channelName == "atime" || channelName == "adate")
                    {
                        readingDate = DateValidator.CreateDate(channelValue);
                    }
                };

                bool nullFlag = false;
                if (channelValue == null)
                    nullFlag = true;

                bool missingFlag = false;
                if (channelValue == "x") {
                    missingFlag = true;
                    channelValue = "0";
                }

                //Add data to model ready for DB insert.
                data.Add(new UriDataModel
                {
                    uid = guid,
                    SerialNumber = serialNumber,
                    ChannelName = channelName,
                    ChannelReadingNumber = channelReadingNumber,
                    ChannelValue = channelValue.Replace(",", "."),
                    ReadingDate = readingDate,
                    TimeStamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm"),
                    Processed = false,
                    NullFlag = nullFlag,
                    MissingFlag = missingFlag
                });
            };

            //Validate dates
            var allDates = (from x in data where x.ChannelName.Contains("atime") || x.ChannelName.Contains("adate") select x.ChannelValue).ToList();
            bool dateValidation = DateValidator.IsValid(allDates);
            if (!dateValidation)
            {
                return ValidationResponseMessage.ResponseHeaders("Date");
            };

            //Validate values
            var channels = Enum.GetNames(typeof(Channels)).ToList();
            List<string> allChannelValues = data.Where(d => channels.Contains(d.ChannelName)).Select(d => d.ChannelValue).ToList();
            bool valueValidation = ValueValidator.IsValid(allChannelValues);
            if (!valueValidation)
            {
                return ValidationResponseMessage.ResponseHeaders("Values");
            };

            //Insert live data
            var insertData = DataInsert<UriDataModel>.InsertData(data, "Staging.UriData");
            if (!insertData)
            {
                return ValidationResponseMessage.ResponseHeaders("Sql");
            }

            var content = "\r\nSUCCESS\r\n";
            var reply = new HttpResponseMessage(System.Net.HttpStatusCode.OK)
            {
                Content = new StringContent(content)
            };

            return reply;
        }
    }
}

ТИА

1 Ответ

0 голосов
/ 01 ноября 2018

Вы используете глобальные переменные и статический метод для обработки ваших данных. Измените свой метод на нестатический. Каждый работник DeviceClass должен обновить только свои собственные изолированные данные, а затем отправить их обратно в контроллер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...