Nik Faraday,
В OnBeginAsyncCallback вы уже в отдельном потоке, поэтому
Для акцепнутого клиента (тут это socket) сразу вызывается
void ReceiveAsync(byte[] buffer, EventHandler<SocketAsyncEventArgs> releaseEvent)
{
var asyncEventArgs = AsyncEventArgsPool.Get();
asyncEventArgs.SetBuffer(buffer, 0, buffer.Length);
asyncEventArgs.Completed += releaseEvent;
bool isAsync;
try
{
asyncEventArgs.RemoteEndPoint = socket.RemoteEndPoint;
isAsync = socket.ReceiveAsync(asyncEventArgs); // если данные уже есть в принимаемом буфере
}
catch (Exception ex)
{
AsyncEventArgsPool.Release(asyncEventArgs, releaseEvent);
CloseConnect(ex);
return;
}
if (!isAsync)
{
// Данные были в буффере, обрабатываем сразу. (Тут мы еще в отдельном потоке)
releaseEvent(this, asyncEventArgs);
}
}
и пример асунхронного обработчика
void OnRecieveDataSizeComplete(object sender, SocketAsyncEventArgs asyncEventArgs)
{
if (asyncEventArgs.SocketError != SocketError.Success)
{
var socketError = asyncEventArgs.SocketError;
AsyncEventArgsPool.Release(asyncEventArgs, OnRecieveDataSizeComplete);
CloseConnectOnException(nameof(OnRecieveDataSizeComplete), socketError.ToString());
return;
}
var buffer = asyncEventArgs.Buffer; // Пришел буфер с данными
var bytesRead = asyncEventArgs.BytesTransferred; // Сколько было в него записано
AsyncEventArgsPool.Release(asyncEventArgs, OnRecieveDataSizeComplete);
if (bytesRead == 0)
{
CloseConnectOnEmpty();
return;
}
var messageSize = BitConverter.ToUInt32(buffer, 0); // Тут я просто получаю сообщение в виде размера остальной части сообщения
ReceiveData(messageSize); // Тут запуск на получение новой порции данных. У меня это само тело сообщения
}
Rsa97, Вы о бумажках, а я просто о конкурентах. Чтобы бесплатно скопировать не могли ))
Да и система становиться более безопасной, так как устраняются анонимные атаки на уязвимости по формату данных.
Алексей Уколов, Такое кеширование часто менее ресурснозатратное чем пройти весь путь запроса с авторизацией, валидациями, агрегированием данных и SQL запросами, парсингом шаблона.
Алексей Уколов, "Плохая идея" это не инженерный подход. )))
Для GET запросов и так подразумевается, что они могут кешироваться не только беком, но и другими прмежуточными прокси. В HTTP есть header "ETag" который как раз для таких случаев.
Алексей Уколов,
п.2 это кеширование внутренних данных приложения на базе которых делаются какие-либо частые проверки в коде. Напимер permissions/roles пользователя.
п.3 это уже сгенеренные данные ответа, без захода в бизнес логику приложения.
Nik Faraday, В message у вас будет тип bytes
rpc SetImage(bytes) returns (...);
или
rpc SetImage(SetRequest) returns (...);
message SetRequest
{
bytes Data = 1;
}
В OnBeginAsyncCallback вы уже в отдельном потоке, поэтому
Для акцепнутого клиента (тут это socket) сразу вызывается