配置路由asp.net webapi

本文关键字:webapi net asp 路由 配置 | 更新日期: 2023-09-27 18:30:10

我正在用asp.net webapi后端构建一个angularJS应用程序。在我的routeconfig文件中,我有这个

routes.MapRoute(
    name: "default",
    url: "{*url}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

这很好用。任何被调用的Url都会返回Home/Index视图(我拥有的唯一视图)给应用程序,angularJS会计算出是否有查询字符串,并计算出显示哪个状态。

我在WebApi中有基本的Get、Put、Post和Delete方法,我可以称它们为fine。例如

public class CompanyController : ApiController
{
    private CompanyService _service;
    public CompanyController(CompanyService service)
    {
        _service = service;
    }
    public async Task<IHttpActionResult> Get()
    {
        ...
        return Ok(model);
    }
    public async Task<IHttpActionResult> Get(int id)
    {
        ...
        return Ok(model);
    }
    public async Task<IHttpActionResult> Post(CompanyModel model)
    {
        ...
        return Ok();
    }
    public async Task<IHttpActionResult> Put(Company model)
    {
        ...
        return Ok();
    }
    public async Task<IHttpActionResult> Delete(CompanyModel model)
    {
        ...
        return Ok();
    }
}

现在,我想在我的api中添加另一个方法,用户可以在其中加载公司,但也可以传递一个要搜索的术语(字符串)、pageSize(int)和页码(int)。像这样的

public async Task<IHttpActionResult> Get(string term, int page, int pageSize) {
    ...
    return Ok(results);
}

现在我明白了,我需要添加另一个路由,以确保这个方法可以被调用。很好,所以我把它添加到我的RouteConfig中。

// search
routes.MapRoute(
    name: "search",
    url: "api/{controller}/{page}/{pageSize}/{term}",
    defaults: new { page = @"'d+", pageSize = @"'d+", term = UrlParameter.Optional }
);

为什么不起作用??当我试图通过邮递员使用URLlocalhost/api/company/1/10/a调用资源时,我遇到了一个找不到资源的错误,其中1=页面,10=pageSize和a=术语

这可能是一个简单的答案,但MVC还是个新手,所以仍在学习中。

配置路由asp.net webapi

1-您使用的是Get方法,这意味着您可以通过Url传递搜索选项,因此您可以创建一个搜索选项对象,如:

public class SearchOptions
{
   public string Term{get; set;}
   public int Page {get; set;}
   public int PageSize {get; set;}
}

然后你可以改变你的方法,像这个

[HttpGet]
[Route("api/blabla/SearchSomething")]
public async Task<IHttpActionResult> Get([FromUri]SearchOptions searchOptions) {
    ...
    return Ok(results);
}

注意我装饰方法的Route属性,您可以对方法参数使用不同的约束,看看这个。

最后,您可以从客户端调用方法,如

api/blabla/SearchSomething?term=somevalue&page=1&pageSize=10

希望能有所帮助。