Member 10192073 Ответов: 1

Как избежать исключения тайм-аута http-ответа в C#


привет,

Я вызываю эту функцию через url-адрес из своего настольного приложения

[HttpPost]
        [AcceptVerbs("POST")]
        async public Task<HttpResponseMessage> SyncItem(long TenantId)
        {
            try
            {
                CashVitae_TM.Tenant oTenant = new CashVitae_TM.Tenant();
                oTenant = oTenant.getTenantByTenantId(TenantId);

                string dbUN = oTenant.DBUN;
                string dbPass = oTenant.DBPass;

                long SavedItemId = 0;
                Item oitem = new Item();
                
                byte[] data = await Request.Content.ReadAsByteArrayAsync();
                string JsonInventory = System.Text.Encoding.Default.GetString(data);
                List<InventoryItem> lstInventoryItem = JsonConvert.DeserializeObject<List<InventoryItem>>(JsonInventory);
                foreach (var Inventory in lstInventoryItem)
                {
                    Item oitem1 = new Item();
                    string ItemCode = Inventory.ItemCode;
                    Item item = oitem.getItembyCode(TenantId, dbUN, dbPass, ItemCode);
                    if (item != null)
                    {
                        oitem1.Id = item.Id;
                        oitem1.Code = item.Code;
                        oitem1.CreatedDtTm = item.CreatedDtTm;
                    }
                    else
                    {
                        oitem1.Id = 0;
                        oitem1.Code = Inventory.ItemCode;
                        oitem1.CreatedDtTm = DateTime.Now;
                    }
                    oitem1.TenantId = TenantId;
                    oitem1.Name = Inventory.Name;
                    oitem1.Category = Convert.ToString(Inventory.Category);
                    oitem1.CostMethod = Convert.ToString(Inventory.MethodName);
                    oitem1.Location = Convert.ToString(Inventory.Location);
                    oitem1.UnitPrice = Inventory.UnitPrice;
                    oitem1.Quantity = Inventory.QtyAvailable;
                    oitem1.QtyOnHand = Inventory.QtyOnHand;
                    oitem1.IsActive = Inventory.IsActive;
                    oitem1.ModifiedDtTm = DateTime.Now;
                    SavedItemId = oitem1.Save(TenantId, dbUN, dbPass);
                }   
                return new HttpResponseMessage(HttpStatusCode.OK);
            }
            catch (Exception ex)
            {
                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message);
            }
        }


а это мой код настольного приложения
try
                        {
                            string str = Inventory();
                            using (WebClient httpclient = new WebClient())
                            {
                                //string str = "abc";
                                string url = "http://localhost:51411/api/MobileAPI/SyncItem?TenantId=" + CommonClass.tenantId;

                                ASCIIEncoding encoding = new ASCIIEncoding();
                                byte[] data = encoding.GetBytes(str);

                                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                                request.Method = "Post";
                                request.ContentLength = data.Length;
                                request.ContentType = "application/json";

                                using (Stream stream = request.GetRequestStream())
                                {
                                    stream.Write(data, 0, data.Length);
                                }
                                request.Timeout = Timeout.Infinite;
                                request.KeepAlive = true;
                                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                                response.StatusCode.ToString();
                            }
                        }
                        catch(Exception ex)
                        {
                            throw ex;
                        }


но я получаю исключение тайм-аута операции на моем рабочем столе

Что я уже пробовал:

Я вызываю метод в своем API для сохранения данных в веб-БД
Я пытался
request.Timeout = Timeout.Infinite;
                                request.KeepAlive = true;


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

Richard Deeming

Начните с тренировки который время операции истекло. Вполне возможно, что ошибка тайм-аута находится на сервере, а не на клиенте.

Member 10192073

Я проверю, но я разделился и теперь отправляю данные со 100 за вызов....

Одно я хочу тебе сказать
Даже в моем настольном приложении я получал исключение таймаута, но мой веб-API тоже работал в это время.
Это означает, что когда я получил исключение тайм-аута в моем настольном приложении, в то время как в моих записях веб-БД было вставлено 156 строк, но всего через несколько секунд я снова запустил select query в веб-БД, я снова получил 258 записей, через несколько секунд я запустил select query и получил 468 строк, это означает, что даже исключение тайм-аута поступало в рабочий стол, но операция шла в моем веб-коде.

1 Ответов

Рейтинг:
2

Bhola Ram Sahu

Очень простая обработка исключений может быть одним из решений вашей проблемы.

try
{
   using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
   {
      WebHeaderCollection headers = response.Headers;    
      using (Stream answer = response.GetResponseStream())
      {
          // Do stuff
      }
   }
}
catch (WebException e)
{
   if (e.Status == WebExceptionStatus.Timeout)
   {
      // Handle timeout exception
   }
   else throw;
}