У меня есть Google для этого, и мне удалось найти несколько ссылок, объясняющих концепцию запросов Async HTTP в C# и Web Api 2. Однако мне не удалось получить какие-либо рабочие примеры.Async HTTP-запрос в Web Api
Как раз для того чтобы очистить воздух, мое требование как ниже. Когда клиент вызывает API (который выполняет длительную обработку), он должен немедленно вернуть HTTP 202 (Accepted) в качестве ответа и продолжить обработку в фоновом режиме. Я до сих пор понимаю. Ниже приведен мой пример кода, как я реализовал то же самое. Где я застрял, когда эта задача длительной обработки завершена в фоновом режиме, она должна запустить обратный вызов одному клиенту и вернуться с ответом HTTP 200. Вполне возможно, что, хотя задача длительной обработки выполнялась в фоновом режиме, клиент выдал другой параллельный запрос с разными значениями.
Может ли кто-нибудь указать мне в правильном направлении. Возможно ли это только через код или какие-либо настройки будут реализованы на уровне IIS. Цените свое время и помогите в этом.
Спасибо всем заблаговременно.
Мой код до сих пор.
public HttpResponseMessage Execute(string plugin, string pluginType, string grid, string version)
{
try
{
var type = this.LoadPlugin(plugin, pluginType, version);
if (type != null)
{
var method = type.GetMethod("Execute");
if (method != null)
{
new Task(() =>
{
// This line will take long to execute.
var filepath = method.Invoke(Activator.CreateInstance(type), new object[1] { grid });
// After this line it must invoke a callback to the client with the response as "filepath" and HTTP status code as 200
type = null;
}).Start();
}
else
{
return new HttpResponseMessage(HttpStatusCode.ServiceUnavailable);
}
}
else
{
return new HttpResponseMessage(HttpStatusCode.ServiceUnavailable);
}
}
catch (Exception ex)
{
return new HttpResponseMessage(HttpStatusCode.InternalServerError);
}
return new HttpResponseMessage(HttpStatusCode.Accepted);
}
private Type LoadPlugin(string plugin, string pluginType, string version)
{
Assembly assembly;
Type returnValue = null;
var pluginFile = new DirectoryInfo(this._pluginPath).GetFiles("*.dll")
.Where(file => FileVersionInfo.GetVersionInfo(file.FullName).OriginalFilename.ToUpper().Contains("TRANSFORMATION." + plugin.ToUpper()))
.OrderByDescending(time => time.LastWriteTime).FirstOrDefault();
if (pluginFile != null)
{
assembly = Assembly.LoadFrom(pluginFile.FullName);
AppDomain.CurrentDomain.Load(assembly.GetName());
returnValue = assembly.GetType("Transformation.Plugins." + pluginType);
assembly = null;
}
return returnValue;
}
Вы не можете отправить несколько ответов для одного запроса, поскольку это будет нарушать стандарт HTTP. Однако вы можете написать собственный код для отправки ответа на конкретное событие. Вы также можете рассмотреть Response.Flush() - https://msdn.microsoft.com/en-us/library/system.web.httpresponse.flush(v=vs.110).aspx –