私はこれを捜して、C#とWeb Api 2でAsync HTTPリクエストの概念を説明するリンクをいくつか見つけることに成功しました。Web ApiでのAsync HTTPリクエスト
空気をきれいにするために、私の要件は以下の通りです。 クライアントが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標準に違反するため、1つのリクエストに対して複数のレスポンスを送信することはできません。しかし、特定のイベントに対して何らかの応答を送るカスタムコードを書くことができます。 Response.Flush() - https://msdn.microsoft.com/en-us/library/system.web.httpresponse.flush(v=vs.110).aspx –