【问题标题】:How to translate this IHttpActionResult to ASP.NET Core IActionResult如何将此 IHttpActionResult 转换为 ASP.NET Core IActionResult
【发布时间】:2018-03-18 12:55:36
【问题描述】:

我在“旧”的 ASP.NET 中有一个 IHttpActionResult,它的 ExecuteAsync 代码如下:

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = _value == null ?
            _request.CreateResponse(StatusCode) :
            _request.CreateResponse(StatusCode, _value);

        if (_uri != null)
        {
            var relativeUri = new Uri(_uri.PathAndQuery, UriKind.Relative);
            response.Headers.Location = relativeUri;
        }
        return Task.FromResult(response);
    }

现在,要将其转换为 ASP.NET Core IActionResult,我意识到我需要将签名更改为

    public async Task ExecuteResultAsync(ActionContext context)

我有两个具体需求:

  1. 如果_value 不为空,则将其作为响应正文发送回;和
  2. 如果_uri 不为空,则在响应的Location 标头中将其发回。

我发现了很多类似的问题,例如 this,它建议操纵 contextResponse 属性 - 但这并不能回答如何为 object 设置正文(而不是一个字符串)或this,它建议使用ObjectResponse,但我不清楚如何添加所需的标题。

你是怎么做到的?

【问题讨论】:

    标签: c# asp.net-core


    【解决方案1】:

    是的,您绝对可以在这种情况下使用ObjectResponse

    关于标题:在ExecuteResultAsync 方法中,您可以通过context.HttpContext.Response 属性直接修改响应,所以这样做:

    public async Task ExecuteResultAsync(ActionContext context)
    {
        // note: ObjectResult allows to pass null in ctor
        var objectResult = new ObjectResult(_value)
        {
            StatusCode = <needed status_code>
        };
    
        context.HttpContext.Response.Headers["Location"] = "<your relativeUri>";
    
        await objectResult.ExecuteResultAsync(context);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-05
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 1970-01-01
      • 2023-02-02
      相关资源
      最近更新 更多