【问题标题】:Request.CreateResponse in asp.net coreASP.NET 核心中的 Request.CreateResponse
【发布时间】:2017-06-05 01:32:37
【问题描述】:

下面是我的代码(部分代码),我想将它迁移到 asp.net 核心。 我的问题是“Request.CreateResponse”在下面的代码中不起作用。我用谷歌搜索了很多,但找不到任何解决方案。我该如何解决?包 Microsoft.AspNet.WebApi.Core 也不起作用。

    [HttpPost]
    public HttpResponseMessage AddBusinessUsersToBusinessUnit(MyObject request)
    {
        return Request.CreateResponse(HttpStatusCode.Unauthorized);
    }

提前致谢。

【问题讨论】:

    标签: asp.net asp.net-core


    【解决方案1】:

    最后我提出了一个解决方案。 :)

    [HttpPost]
    public HttpResponseMessage AddBusinessUsersToBusinessUnit(MyObject request)
    {
        return new HttpResponseMessage(HttpStatusCode.Unauthorized);
    }
    

    【讨论】:

    • 如何向响应中添加内容?
    • @IeuanW ReasonPhrase 属性
    • @ShmilTheCat 你将如何添加字符串以外的内容,因为 ReasonPhrase 是字符串类型属性?
    • @lazydeveloper 使用Newtonsoft的Json.NET,并定义扩展方法:public static HttpResponseMessage CreateResponse<T>(this HttpRequestMessage requestMessage, HttpStatusCode statusCode, T content) { return new HttpResponseMessage() { StatusCode = statusCode, Content = new StringContent(JsonConvert.SerializeObject(content)) }; }
    【解决方案2】:

    如果你只是想返回一个状态码,下面的更可取

    //Creates a StatusCodeResult object by specifying a statusCode.
    //so controller method should return IActionResult 
    return StatusCode(HttpStatusCode.Unauthorized)
    

    this SO answer 中查看更多信息

    【讨论】:

      【解决方案3】:

      对于 Core 2.1+,返回 ActionResult 或 IActionResult 而不是 HttpResponseMessage。这为您提供了难以置信的灵活性。下面是返回内容的示例。

      [HttpPost]
      public ActionResult<BusinessUsers> AddBusinessUsersToBusinessUnit(MyObject request)
      {   var businessUsers = AddBusinessUsers(request);
          return Request.CreateResponse(HttpStatusCode.Unauthorized, businessUsers);
      }
      

      https://docs.microsoft.com/en-us/aspnet/core/web-api/action-return-types?view=aspnetcore-2.2

      在 Core 3.0 中,您必须使用 ProducesResponseType 确定所有可能的返回类型 https://docs.microsoft.com/en-us/aspnet/core/web-api/action-return-types?view=aspnetcore-3.0

      【讨论】:

      • @HaithemKAROUI 谢谢我更新了答案,为那些使用 Core 3.0 的人添加了 ProducesResponseType。
      【解决方案4】:

      最新版本不是返回 Request.Create Response,而是允许为 200 http 状态代码返回 Ok 并在您的响应中添加模型(如果您愿意) 同时返回 IActionResult 而不是 HttpResponseMessage

      public IActionResult Method()
      {
        try
        {
           return Ok(new TokenResponseModel { Status = "ok", Message = "valid token" });
        }
      }
      

      【讨论】:

      • 虽然这段代码可能会回答这个问题,但您是否可以考虑添加一些解释来说明您解决了什么问题,以及您是如何解决的?这将有助于未来的读者更好地理解您的答案并从中学习。
      【解决方案5】:

      试试这个,下面是示例 HTTP 获取控制器函数

         using System;
         using System.Net.Http;
         using System.Net;
         using System.Web.Http;
         using System.Threading.Tasks;
         using Newtonsoft.Json;
         using Newtonsoft.Json.Linq;
      
          [HttpGet]
          public async Task<ActionResult<string>> GetItem()
          {
              try
              {
                  var Item = null;
                  return JsonConvert.SerializeObject(Item);
              }
              catch (Exception ex)
              {
                  HttpRequestMessage request = new HttpRequestMessage();
                  HttpResponseMessage response = request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message);
                  throw new System.Web.Http.HttpResponseException(response);
              }
          }
      

      【讨论】:

        【解决方案6】:

        试试类似的方法

        public async Task<IActionResult> Method()
        {
          try
          {
             var content = someCollectionReturnedFromDatabase();
             return Ok(content);
          }
          catch(Exception ex)
          {
            _logger.LogWarning(ex.Message, ex);
            return BadRequest(ex.Message); // this can be something like notfound
          }
        }
        

        【讨论】:

          猜你喜欢
          • 2017-10-23
          • 2018-05-25
          • 2021-08-21
          • 2017-06-02
          • 2017-12-17
          • 2022-01-11
          • 1970-01-01
          • 2021-09-21
          相关资源
          最近更新 更多