簡體   English   中英

我的路線怎么了

[英]What's wrong with my routes

我在webApiConfig聲明了以下路由。

config.Routes.MapHttpRoute(
   name: "DefaultApiWithAction",
   routeTemplate: "api/{controller}/{action}/{id}",
   defaults: new { id = RouteParameter.Optional }
);

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

以下是控制器上的路由屬性:

[Route("users")]
public IHttpActionResult Get()


[Route("users/{id}")]
public IHttpActionResult Get(int id)

[AllowAnonymous]
[HttpPost]
[Route("users/validate")]
public IHttpActionResult Validate(string email)

當我打電話給:
〜/ api / users-有效
〜/ api / users / 1-有效
〜/ api / users / validate-失敗...嘗試進入api / users / 1,但由於Post動詞而失敗。

如何設置路由,以便可以在用戶控制器中驗證用戶?

嘗試使用use屬性路由來裝飾validate方法:

http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

例如

[Route(“ customers / {customerId} / orders”)]

公開IEnumerable GetOrdersByCustomer(int customerId){...}

使用PostmanFiddler測試POST操作,因為您無法使用瀏覽器執行該操作。

您不需要注冊“ 定制路由” ,因為您已經擁有“ 屬性路由”

從您的代碼中刪除DefaultApiWithAction路由。 相反,您將需要RoutePrefix

[RoutePrefix("api/users")]
public class UsersController : ApiController
{
    public IHttpActionResult Get()
    {
        return Ok(new [] {"value1", "value2"});
    }

    public IHttpActionResult Get(int id)
    {
        return Ok(id);
    }

    [HttpPost]
    [Route("validate")]
    public IHttpActionResult Validate([FromBody]string email)
    {
        return Ok(email);
    }
}

如何測試HttpPost

在Chrome瀏覽器中安裝Postman 您也可以使用Fiddler或其他一些工具。

  1. 選擇POST並輸入URL http://localhost:XXXXX/api/users/validate
  2. 選擇application/json作為內容類型
  3. 輸入內容"johndoe@example.com"
  4. 單擊發送后,您應該看到結果

在此處輸入圖片說明

API斷點

在此處輸入圖片說明

您尚未啟用屬性路由 您已經省略了MapHttpAttributeRoutes上的HttpConfiguration

public static void Register(HttpConfiguration config)
{
    // Attribute routing.
    config.MapHttpAttributeRoutes();

    // Convention-based routing.
    config.Routes.MapHttpRoute(
       name: "DefaultApiWithAction",
       routeTemplate: "api/{controller}/{action}/{id}",
       defaults: new { id = RouteParameter.Optional }
    );

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

您還需要確保在ApiController上也正確設置了路由

[RoutePrefix("api/users")]
public class UsersController : ApiController {

    //GET api/users
    [HttpGet]
    [Route("")]
    public IHttpActionResult Get() { ... }

    //GET api/users/5    
    [HttpGet]    
    [Route("{id}")]
    public IHttpActionResult Get(int id) { ... }

    //POST api/users/validate?email=someone@email.com
    [AllowAnonymous]
    [HttpPost]
    [Route("validate")]
    public IHttpActionResult Validate(string email) { ... }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM