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);
【讨论】:
如何向响应中添加内容? @IeuanWReasonPhrase
属性
@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的主要内容,如果未能解决你的问题,请参考以下文章