Я использую WebAPI только с одним промежуточным программным обеспечением и не могу установить код ответа HTTP-ответа.
Я использую OnSendingHeaders () и могу добавить заголовки и задать тело ответа, но код состояния не устанавливается, и для ответа всегда устанавливается значение 200 OK.
Я могу установить код статуса ответа в ValidateUrl (контекст), хотя. Разница в том, что ValidateUrl (context) вызывается синхронно, а OnSendingHeaders () вызывается асинхронно после выполнения ProcessIncomingRequest ().
Отправляется ли строка состояния HTTP еще до вызова OnSendingHeaders ()?
Как / где я должен установить HTTP-код ответа, когда входящий запрос обрабатывается асинхронно?
public class Startup
{
public void Configuration(IAppBuilder appBuilder)
{
appBuilder.Use(typeof(SampleMiddleware));
}
}
public class SampleMiddleware : OwinMiddleware
{
private string _responseBody = null;
public SampleMiddleware(OwinMiddleware next) : base(next)
{
}
public async override Task Invoke(IOwinContext context)
{
if (!ValidateUrl(context))
{
return;
}
context.Response.OnSendingHeaders(state =>
{
var cntxt = (IOwinContext)state;
SetResponseMessage(cntxt);
}, context);
await ProcessIncomingRequest();
await Next.Invoke(context);
}
private void SetResponseMessage(IOwinContext context)
{
//Setting status code
context.Response.StatusCode = 201;
//Setting headers
context.Response.Headers.Add("XYZ", new[] { "Value-1" });
context.Response.Headers.Add("ABC", new[] { "Value-2" });
//Setting response body
context.Response.Write(_responseBody);
}
private async Task ProcessIncomingRequest()
{
// Process request
//await ProcessingFunc();
// Set response body
_responseBody = "Response body based on above processing";
}
private bool ValidateUrl(IOwinContext context)
{
if (context.Request.Host.ToString().Equals("xyx"))
{
return true;
}
else
{
context.Response.StatusCode = 400;
context.Response.Write("Bad Request");
return false;
}
}
}