У меня есть приложение на базе ядра ASP.net, в которое встроен платежный шлюз Spreedly для обработки платежей. В своих файлах журналов я вижу, что иногда контроллер платежей выполняется дважды. Я генерирую идентификатор на основе времени получения запроса, и иногда идентификаторы различаются на 1 секунду, а иногда они находятся в одно и то же время. Это приводит к тому, что карта списывается дважды лишь в некоторых случаях. Кажется, я не могу понять, что может вызвать это.
Ниже приведен код, который я использую
Пользователь заполняет форму заявки и нажимает кнопку оплаты. Я использую этот код для быстрого запуска
$('#REG').click(function () {
var options = {
company_name: "abcd",
sidebar_top_description: "Fees",
sidebar_bottom_description: "Only Visa and Mastercard accepted",
amount: "@string.Format("{0:c}",Convert.ToDecimal(Model.FeeOutstanding))"
}
document.getElementById('payment').value = 'App'
SpreedlyExpress.init(environmentKey, options);
SpreedlyExpress.openView();
$('#spreedly-modal-overlay').css({ "position": "fixed", "z-index": "9999", "bottom": "0", "top": "0", "right": "0", "left": "0" });
});
Откроется форма быстрой оплаты в виде всплывающего окна, в котором пользователь вводит всю информацию о карте и нажимает кнопку оплаты. Который выполняет контроллер платежей
public async Task Index(DynamicViewModel model)
{
if (ModelState.IsValid)
{
try
{
if (TempData.ContainsKey("PaymentFlag") && !String.IsNullOrEmpty(TempData["PaymentFlag"].ToString()))
{
// Some code logic that calls few async methods
//generate a id based on the time of current request
"APP-" + DateTime.Now.ToString("yyyyMMddHmmss-") + model.UserID;
// ... Other code here
}
Идентификатор, который я генерирую, регистрируется, и я вижу, что несколько раз в файле журнала он запускался дважды для клиента с идентификатором, имеющим либо одно и то же время, либо разница была в 1 секунду. Я протестировал сценарий двойного щелчка, а также добавил код, предотвращающий двойные щелчки. Но до сих пор я не могу понять, почему иногда это происходит. Это не часто. Это похоже на 1 случай из 100 платежей.
У меня есть атрибут действия для обработки повторяющихся запросов. После добавления этого кода количество повторяющихся запросов прекратилось, но не полностью. Тем не менее, в некоторых случаях контроллеры вызываются дважды.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class NoDuplicateRequestAttribute : ActionFilterAttribute
{
public int DelayRequest = 10;
// The Error Message that will be displayed in case of
// excessive Requests
public string ErrorMessage = "Excessive Request Attempts Detected.";
// This will store the URL to Redirect errors to
public string RedirectURL;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Store our HttpContext (for easier reference and code brevity)
var request = filterContext.HttpContext.Request;
// Store our HttpContext.Cache (for easier reference and code brevity)
var cache = filterContext.HttpContext.RequestServices.GetService();
// Grab the IP Address from the originating Request (example)
var originationInfo = request.HttpContext.Connection.RemoteIpAddress.ToString() ?? request.HttpContext.Features.Get()?.RemoteIpAddress.ToString();
// Append the User Agent
originationInfo += request.Headers["User-Agent"].ToString();
// Now we just need the target URL Information
var targetInfo = request.HttpContext.Request.GetDisplayUrl() + request.QueryString;
// Generate a hash for your strings (appends each of the bytes of
// the value into a single hashed string
var hashValue = string.Join("", MD5.Create().ComputeHash(Encoding.ASCII.GetBytes(originationInfo + targetInfo)).Select(s => s.ToString("x2")));
string cachedHash;
// Checks if the hashed value is contained in the Cache (indicating a repeat request)
if (cache.TryGetValue(hashValue,out cachedHash))
{
// Adds the Error Message to the Model and Redirect
}
else
{
// Adds an empty object to the cache using the hashValue
// to a key (This sets the expiration that will determine
// if the Request is valid or not)
var opts = new MemoryCacheEntryOptions()
{
SlidingExpiration = TimeSpan.FromSeconds(DelayRequest)
};
cache.Set(hashValue,cachedHash,opts);
}
base.OnActionExecuting(filterContext);
}
Подробнее здесь: https://stackoverflow.com/questions/439 ... lled-twice
Ядро ASP.Net иногда контроллер действий вызывается дважды ⇐ C#
Место общения программистов C#
-
Anonymous
1721783603
Anonymous
У меня есть приложение на базе ядра ASP.net, в которое встроен платежный шлюз Spreedly для обработки платежей. В своих файлах журналов я вижу, что иногда контроллер платежей выполняется дважды. Я генерирую идентификатор на основе времени получения запроса, и иногда идентификаторы различаются на 1 секунду, а иногда они находятся в одно и то же время. Это приводит к тому, что карта списывается дважды лишь в некоторых случаях. Кажется, я не могу понять, что может вызвать это.
Ниже приведен код, который я использую
Пользователь заполняет форму заявки и нажимает кнопку оплаты. Я использую этот код для быстрого запуска
$('#REG').click(function () {
var options = {
company_name: "abcd",
sidebar_top_description: "Fees",
sidebar_bottom_description: "Only Visa and Mastercard accepted",
amount: "@string.Format("{0:c}",Convert.ToDecimal(Model.FeeOutstanding))"
}
document.getElementById('payment').value = 'App'
SpreedlyExpress.init(environmentKey, options);
SpreedlyExpress.openView();
$('#spreedly-modal-overlay').css({ "position": "fixed", "z-index": "9999", "bottom": "0", "top": "0", "right": "0", "left": "0" });
});
Откроется форма быстрой оплаты в виде всплывающего окна, в котором пользователь вводит всю информацию о карте и нажимает кнопку оплаты. Который выполняет контроллер платежей
public async Task Index(DynamicViewModel model)
{
if (ModelState.IsValid)
{
try
{
if (TempData.ContainsKey("PaymentFlag") && !String.IsNullOrEmpty(TempData["PaymentFlag"].ToString()))
{
// Some code logic that calls few async methods
//generate a id based on the time of current request
"APP-" + DateTime.Now.ToString("yyyyMMddHmmss-") + model.UserID;
// ... Other code here
}
Идентификатор, который я генерирую, регистрируется, и я вижу, что несколько раз в файле журнала он запускался дважды для клиента с идентификатором, имеющим либо одно и то же время, либо разница была в 1 секунду. Я протестировал сценарий двойного щелчка, а также добавил код, предотвращающий двойные щелчки. Но до сих пор я не могу понять, почему иногда это происходит. Это не часто. Это похоже на 1 случай из 100 платежей.
У меня есть атрибут действия для обработки повторяющихся запросов. После добавления этого кода количество повторяющихся запросов прекратилось, но не полностью. Тем не менее, в некоторых случаях контроллеры вызываются дважды.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class NoDuplicateRequestAttribute : ActionFilterAttribute
{
public int DelayRequest = 10;
// The Error Message that will be displayed in case of
// excessive Requests
public string ErrorMessage = "Excessive Request Attempts Detected.";
// This will store the URL to Redirect errors to
public string RedirectURL;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Store our HttpContext (for easier reference and code brevity)
var request = filterContext.HttpContext.Request;
// Store our HttpContext.Cache (for easier reference and code brevity)
var cache = filterContext.HttpContext.RequestServices.GetService();
// Grab the IP Address from the originating Request (example)
var originationInfo = request.HttpContext.Connection.RemoteIpAddress.ToString() ?? request.HttpContext.Features.Get()?.RemoteIpAddress.ToString();
// Append the User Agent
originationInfo += request.Headers["User-Agent"].ToString();
// Now we just need the target URL Information
var targetInfo = request.HttpContext.Request.GetDisplayUrl() + request.QueryString;
// Generate a hash for your strings (appends each of the bytes of
// the value into a single hashed string
var hashValue = string.Join("", MD5.Create().ComputeHash(Encoding.ASCII.GetBytes(originationInfo + targetInfo)).Select(s => s.ToString("x2")));
string cachedHash;
// Checks if the hashed value is contained in the Cache (indicating a repeat request)
if (cache.TryGetValue(hashValue,out cachedHash))
{
// Adds the Error Message to the Model and Redirect
}
else
{
// Adds an empty object to the cache using the hashValue
// to a key (This sets the expiration that will determine
// if the Request is valid or not)
var opts = new MemoryCacheEntryOptions()
{
SlidingExpiration = TimeSpan.FromSeconds(DelayRequest)
};
cache.Set(hashValue,cachedHash,opts);
}
base.OnActionExecuting(filterContext);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/43981360/asp-net-core-sometimes-the-action-controller-is-called-twice[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия