Asp 网络属性路由,POST 和 PUT 在子资源上不起作用
Asp net attribute routing, POST and PUT not working on child resource
我在网络 api 项目中定义了以下控制器:
[RoutePrefix("api/installations")]
public class InstallationsController : BaseController
{
// GET all
[Authorize]
[Route("")]
public async Task<IHttpActionResult> Get(){ /*...*/}
// GET single
[Authorize]
[Route("{id:int}")]
public async Task<IHttpActionResult> GetInstallation(int id){ /*...*/}
//POST new
[Authorize]
[Route("")]
public async Task<IHttpActionResult> PostInstallation(ViewModels.Installation installation){ /*...*/}
//PUT update
[Authorize]
[Route("{id:int}")]
public async Task<IHttpActionResult> PutInstallation(int id, ViewModels.Installation installation){ /*...*/}
// DELETE
[Authorize]
[Route("{id:int}")]
public async Task<IHttpActionResult> DeleteInstallation(int id){ /*...*/}
[Authorize]
[Route("{id:int}/newimage")]
[HttpPut]
public async Task<IHttpActionResult> PutNewImageUri(int installationId){ /*...*/}
}
除了最后一条,上面的所有路线都有效,我基本上想做一个 PUT(我也试过 POST 但运气不好)到 "api/installations/1/newimage" 并得到 link 用于将二进制数据上传到 Blob 存储。我的问题似乎是任何 POST 或 PUT(可能还有 DELETE)任何 "after" "{id:int}" 字段都不起作用。
GET 实际上工作正常,因为我在另一个控制器中有这个:
[RoutePrefix("api/customers")]
public class CustomersController : BaseController
// GET related items
[Authorize]
[Route("{id:int}/{subitem}")]
public async Task<IHttpActionResult> GetCustomerChild(int id, string subItem)
对于 "api/customers/1/anystring" 的 GET 请求,这将被调用,并且当我也只有“/installations”而不是“/{subitem}”作为变量时它起作用了。将我的 PUT 处理程序更改为“{id:int}/{imageAction}”也不起作用。
在我的 WebApiConfig class 我只有以下内容(没有基于约定的路由):
config.MapHttpAttributeRoutes();
在浏览器中我只得到这个回复,为此我发现了多个类似的问题,但没有解决我的问题的方法:
{
"message": "No HTTP resource was found that matches the request URI 'https://localhost:44370/api/installations/6/newimage'.",
"messageDetail": "No action was found on the controller 'Installations' that matches the request."
}
我已经开始尝试使用这个问题中的代码进行调试:
看起来我的 route/function 出现在 RouteEntries 列表中,但它似乎仍然不符合我的要求,而且我找不到任何关于如何调试的好建议这进一步。任何指针将不胜感激!
这是因为您的操作包含 installationId
的参数,但您的路由配置为 id
,因此它们不匹配。
要么改变路线:
[Route("{installationId:int}/newimage")]
或签名:
public async Task<IHttpActionResult> PutNewImageUri(int id){ /*...*/}
我在网络 api 项目中定义了以下控制器:
[RoutePrefix("api/installations")]
public class InstallationsController : BaseController
{
// GET all
[Authorize]
[Route("")]
public async Task<IHttpActionResult> Get(){ /*...*/}
// GET single
[Authorize]
[Route("{id:int}")]
public async Task<IHttpActionResult> GetInstallation(int id){ /*...*/}
//POST new
[Authorize]
[Route("")]
public async Task<IHttpActionResult> PostInstallation(ViewModels.Installation installation){ /*...*/}
//PUT update
[Authorize]
[Route("{id:int}")]
public async Task<IHttpActionResult> PutInstallation(int id, ViewModels.Installation installation){ /*...*/}
// DELETE
[Authorize]
[Route("{id:int}")]
public async Task<IHttpActionResult> DeleteInstallation(int id){ /*...*/}
[Authorize]
[Route("{id:int}/newimage")]
[HttpPut]
public async Task<IHttpActionResult> PutNewImageUri(int installationId){ /*...*/}
}
除了最后一条,上面的所有路线都有效,我基本上想做一个 PUT(我也试过 POST 但运气不好)到 "api/installations/1/newimage" 并得到 link 用于将二进制数据上传到 Blob 存储。我的问题似乎是任何 POST 或 PUT(可能还有 DELETE)任何 "after" "{id:int}" 字段都不起作用。 GET 实际上工作正常,因为我在另一个控制器中有这个:
[RoutePrefix("api/customers")]
public class CustomersController : BaseController
// GET related items
[Authorize]
[Route("{id:int}/{subitem}")]
public async Task<IHttpActionResult> GetCustomerChild(int id, string subItem)
对于 "api/customers/1/anystring" 的 GET 请求,这将被调用,并且当我也只有“/installations”而不是“/{subitem}”作为变量时它起作用了。将我的 PUT 处理程序更改为“{id:int}/{imageAction}”也不起作用。
在我的 WebApiConfig class 我只有以下内容(没有基于约定的路由):
config.MapHttpAttributeRoutes();
在浏览器中我只得到这个回复,为此我发现了多个类似的问题,但没有解决我的问题的方法:
{
"message": "No HTTP resource was found that matches the request URI 'https://localhost:44370/api/installations/6/newimage'.",
"messageDetail": "No action was found on the controller 'Installations' that matches the request."
}
我已经开始尝试使用这个问题中的代码进行调试:
看起来我的 route/function 出现在 RouteEntries 列表中,但它似乎仍然不符合我的要求,而且我找不到任何关于如何调试的好建议这进一步。任何指针将不胜感激!
这是因为您的操作包含 installationId
的参数,但您的路由配置为 id
,因此它们不匹配。
要么改变路线:
[Route("{installationId:int}/newimage")]
或签名:
public async Task<IHttpActionResult> PutNewImageUri(int id){ /*...*/}