ASP.NET 核心中的 Request.CreateResponse

Posted

技术标签:

【中文标题】ASP.NET 核心中的 Request.CreateResponse【英文标题】:Request.CreateResponse in asp.net core 【发布时间】: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);
    

提前致谢。

【问题讨论】:

【参考方案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
  

【讨论】:

以上是关于ASP.NET 核心中的 Request.CreateResponse的主要内容,如果未能解决你的问题,请参考以下文章

asp.net核心中的TempData为空

asp.net 核心中的红隼

我心目中的Asp.net核心对象

asp.net 核心中的 jwt 令牌无效

ASP.NET 核心中的 Request.CreateResponse

处理asp.net核心中的异常?