- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有时我允许使用原始数据创建/更新物联网设备的状态。这意味着客户端可以将设备设备状态作为字节数组读取并通过 API 发送该数据。服务器解析的数据并作为常规 DTO 发回。
对于创建我可能会介绍以下 CreateStatusFromRawData
方法:
[HttpGet("{id}/status")]
[ProducesResponseType(200, Type = typeof(DeviceStatus))]
[ProducesResponseType(404)]
public async Task<IActionResult> GetStatus(Guid id)
{
// gets the device status
}
[HttpPost("{id}/status/rawdata")]
[ProducesResponseType(201, Type = typeof(DeviceStatus))]
[ProducesResponseType(404)]
public async Task<IActionResult> CreateStatusFromRawData(Guid id, [FromBody]byte[] rawdata)
{
// some parsing logic
return CreatedAtAction(nameof(GetStatus), new {id})
}
[HttpPut("{id}/status/rawdata")]
[ProducesResponseType(200, Type = typeof(DeviceStatus))]
[ProducesResponseType(404)]
public async Task<IActionResult> UpdateStatusFromRawData(Guid id, [FromBody]byte[] rawdata)
{
// some parsing logic
return **UpdatedAtAction**(nameof(GetStatus), new {id})
}
最佳答案
您可以实现自己的 UpdatedAtAction
喜欢 CreatedAtAction .
UpdatedAtActionResult
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Net.Http.Headers;
using System;
namespace MVCPro.CustomResult
{
public class UpdatedAtActionResult : ObjectResult
{
private const int DefaultStatusCode = StatusCodes.Status200OK;
public UpdatedAtActionResult(
string actionName,
string controllerName,
object routeValues,
object value)
: base(value)
{
ActionName = actionName;
ControllerName = controllerName;
RouteValues = routeValues == null ? null : new RouteValueDictionary(routeValues);
StatusCode = DefaultStatusCode;
}
/// <summary>
/// Gets or sets the <see cref="IUrlHelper" /> used to generate URLs.
/// </summary>
public IUrlHelper UrlHelper { get; set; }
/// <summary>
/// Gets or sets the name of the action to use for generating the URL.
/// </summary>
public string ActionName { get; set; }
/// <summary>
/// Gets or sets the name of the controller to use for generating the URL.
/// </summary>
public string ControllerName { get; set; }
/// <summary>
/// Gets or sets the route data to use for generating the URL.
/// </summary>
public RouteValueDictionary RouteValues { get; set; }
/// <inheritdoc />
public override void OnFormatting(ActionContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
base.OnFormatting(context);
var request = context.HttpContext.Request;
var urlHelper = UrlHelper;
if (urlHelper == null)
{
var services = context.HttpContext.RequestServices;
urlHelper = services.GetRequiredService<IUrlHelperFactory>().GetUrlHelper(context);
}
var url = urlHelper.Action(
ActionName,
ControllerName,
RouteValues,
request.Scheme,
request.Host.ToUriComponent());
if (string.IsNullOrEmpty(url))
{
throw new InvalidOperationException("NoRoutesMatched");
}
context.HttpContext.Response.Headers[HeaderNames.Location] = url;
}
}
}
public class MyControllerBase: Controller
{
[NonAction]
public virtual UpdatedAtActionResult UpdatedAtAction(string actionName, object value)
=> UpdatedAtAction(actionName, routeValues: null, value: value);
[NonAction]
public virtual UpdatedAtActionResult UpdatedAtAction(string actionName, object routeValues, object value)
=> UpdatedAtAction(actionName, controllerName: null, routeValues: routeValues, value: value);
[NonAction]
public virtual UpdatedAtActionResult UpdatedAtAction(
string actionName,
string controllerName,
object routeValues,
object value)
=> new UpdatedAtActionResult(actionName, controllerName, routeValues, value);
}
[Route("api/User")]
public class UserApiController : MyControllerBase
{
[HttpGet("{id}/status")]
[ProducesResponseType(200, Type = typeof(DeviceStatus))]
[ProducesResponseType(404)]
public async Task<IActionResult> GetStatus(Guid id)
{
// gets the device status
return Ok(new DeviceStatus { DeviceId = id });
}
[HttpPost("{id}/status/rawdata")]
[ProducesResponseType(201, Type = typeof(DeviceStatus))]
[ProducesResponseType(404)]
public async Task<IActionResult> CreateStatusFromRawData(Guid id, [FromBody]byte[] rawdata)
{
// some parsing logic
return CreatedAtAction(nameof(GetStatus), new { id });
}
[HttpPut("{id}/status/rawdata")]
[ProducesResponseType(200, Type = typeof(DeviceStatus))]
[ProducesResponseType(404)]
public async Task<IActionResult> UpdateStatusFromRawData(Guid id, [FromBody]byte[] rawdata)
{
// some parsing logic
return UpdatedAtAction(nameof(GetStatus), new { id });
}
}
关于c# - 用于更新操作的 CreatedAtAction 模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53911629/
有时我允许使用原始数据创建/更新物联网设备的状态。这意味着客户端可以将设备设备状态作为字节数组读取并通过 API 发送该数据。服务器解析的数据并作为常规 DTO 发回。 对于创建我可能会介绍以下 Cr
有没有办法让 CreatedAtAction 将查询参数附加到生成的 Location header ? 我正在使用的操作方法是这样声明的: [HttpGet("{candidateId:guid}"
关于“No route matches the supplied values”错误的问题有很多,但我还没有在答案中找到任何解决方案:( 这是我的 Controller : [ApiVersion("
在 EF Core 2 中,CreatedAtAction 将参数附加为 api/sample?id=1。我如何配置它以返回 api/sample/1? [ApiController]
更改我的 Controller 以通过 _context.AddRange() 将数据插入数据库后,我在 Postman 的控制台上看到了这个错误“错误:读取 ECONNRESET”。以前,我通过 _
我正在关注 [1] 设置我的第一个 .NET Core WebAPI(从“旧”WebAPI 移动)。当我执行 HttpPost 操作时,如教程中所示: [HttpPost] public IActio
我在使用 CreatedAtAction 时遇到了一个奇怪的问题,如果我的方法名称以“Async”关键字结尾,当我从我的 Add 方法返回 CreatedAtAction 时,我会收到 500 错误“
这些功能的根本区别是什么?我所知道的是所有三个结果都是 201,这适合成功的 POST 请求。 我只遵循在网上看到的示例,但它们并没有真正解释他们为什么要做他们正在做的事情。 我们应该为 GET 提供
我是一名优秀的程序员,十分优秀!