Asp网络属性路由,POST和PUT不在子资源上工作

时间:2017-01-18 09:24:00

标签: c# asp.net asp.net-web-api attributerouting

我在web 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,没有运气)到#34; api / installations / 1 / newimage&#34;并获取用于将二进制数据上载到Blob存储的链接。我的问题似乎是任何POST或PUT(可能是删除)到任何事情&#34;&#34; &#34; {id:int}&#34;领域不起作用。 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)

对于&#34; api / customers / 1 / anystring&#34;的GET请求将被调用,当我只有&#34; / installed&#34;而不是&#34; / {subitem}&#34;作为变量。将我的PUT处理程序更改为&#34; {id:int} / {imageAction}&#34;也不起作用。

在我的WebApiConfig类中,我只有以下内容(没有基于约定的路由):

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."
}

我已经开始尝试使用此问题中的代码进行调试:get a list of attribute route templates asp.net webapi 2.2

看起来我的路线/功能显示在RouteEntries列表中,但它似乎并不像我的请求那样匹配,我找不到任何好的建议我如何进一步调试。任何指针都将不胜感激!

1 个答案:

答案 0 :(得分:0)

这是因为您的操作包含array (size=3) 'hotel_id' => int 132 'image' => string './uploads/images/132/Untitled.jpg' (length=33) 'caption' => string 'Some string' (length=9) // and here i got this error: Message: Undefined offset: 1 array (size=3) 'hotel_id' => int 132 'image' => string './uploads/images/132/unnamed.jpg' (length=32) 'caption' => null 的参数,但您的路线配置了installationId,因此它们不匹配。

更改路线:

id

或签名:

[Route("{installationId:int}/newimage")]