我想将我的api告知消费者新创建的对象的位置.我知道有Created() CreatedAtRoute()CreatedAtAction(),但我不确定如何使用它.

以下是我try 过的:

我想指出Get个资源.它以一个ID作为输入:

    [HttpGet("/${id}", Name = "GetProduct")]
    [ProducesResponseType(typeof(Produkt), 200)]
    public IActionResult Get([FromRoute] int id)
    {
       // some code...
        return Ok(...);
    }

当通过我的POST路由创建产品时,我想通过位置标题指向此资源:

Attempt 1

    [HttpPost]
    [ProducesResponseType(typeof(Produkt), 200)]
    public IActionResult CreateNewProduct([FromBody] ProduktDtoForCreate productFromBody)
    {
        //...
        return CreatedAtRoute("GetProduct", new { id = productToCreate.Id }, productToCreate);
    }

这将返回Location Header:100$15003

Attempt 2

    [HttpPost]
    [ProducesResponseType(typeof(Produkt), 200)]
    public IActionResult CreateNewProduct([FromBody] ProduktDtoForCreate productFromBody)
    {
        //...
        return Created(new Uri($"{Request.Path}/{productToCreate.Id}", UriKind.Relative), productToCreate);
    }

这一个可以工作并返回/api/v1.0/produkte/16004,但似乎不需要使用当前请求来指向新位置.我也不确定这是否是一个好的做法?

推荐答案

在GET方法的路由中,同时go 掉前导/和$out(即它应该只是"{id}").在那里有前导/意味着路由将相对于应用程序的基本路径;取出它将使方法的路由相对于控制器的基本路径.$被视为路由中的文字字符,因此它出现在try 1中的Location标头中.一旦进行了更改,您会发现CreatedAtRoute调用的工作方式与您预期的一样.

Asp.net相关问答推荐

'dotnet --version is returning您必须安装或更新.NET才能运行此应用程序.三十九岁;

ASP.NET MVC forEach 循环仅返回 1 个值

Web 部署工具 2.1 和 Web 部署 3.5 有什么区别?从 VS 2010 部署需要哪一个?

从 Request.Url.AbsolutePath 获取应用相对 url

ASP.NET 平台是否有与 Heroku 等价的工具?

如何设置 CSS 切换器

如何将枚举类型绑定到 DropDownList?

在 asp.net 中将 JSON 转换为 .Net 对象时出错

IIS 会话超时与 ASP.NET 会话超时

DropDownList AppendDataBoundItems(第一项为空白且无重复项)

如何在 ASP.net 中使用 wkhtmltopdf.exe

如何将数据集转换为数据表

为什么混合 Razor Pages 和 VueJs 是一件坏事?

Fiddler 没有从 ASP.NET 网站嗅探 SOAP 流量

ASP.Net 错误:应用程序池的标识无效

HttpContext.Current属性的跨线程使用及相关的东西

主机与 DnsSafeHost

URL 路由、图像处理程序和潜在危险的 Request.Path 值

GZIP 与 DEFLATE 压缩相比有什么优势?

如何在asp.net的GridView中按列名而不是按索引获取单元格值