OWIN Middleware не может установить код состояния http

#asp.net #asp.net-web-api2 #owin #owin-middleware

#asp.net #asp.net-web-api2 #owin #owin-промежуточное программное обеспечение

Вопрос:

Я запускаю WebAPI только с одним промежуточным программным обеспечением и не могу установить ответный код состояния HTTP.

Я использую OnSendingHeaders () и могу добавлять заголовки и задавать тело ответа, но код состояния не устанавливается, и в ответе всегда задается значение 200 OK.

Однако я могу установить код состояния ответа в ValidateUrl (контекст). Разница в том, что ValidateUrl (контекст) вызывается синхронно, а 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;
        }
    }
}