asp.net webapi url用于标识相同的资源

时间:2013-03-18 21:26:10

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api asp.net-web-api-routing

我希望能够通过不同的ID类型识别资源。例如:

获取http://example.com/customers/internalId=34转到

public Customer GetByInternalId(int internalId){...}

和 GET http://example.com/customers/externalId='JohnDoe'去

public Customer GetByExternalId(string externalId){...}

我知道我可以通过在通用控制器方法中使用一些解析逻辑来做到这一点,但我不想这样做。如果可能的话,如何使用asp.net webapi的路由功能实现此目的。

2 个答案:

答案 0 :(得分:1)

我建议你尽量避免做你的建议。为同一资源创建两个不同的URI将使得使用缓存变得更加困难。相反,我建议使用一个URL重定向到另一个。

e.g。

> GET /customers/34
< 200 OK


> GET /Customers?name=JohnDoe
< 303 See Other
< Location: http://example.com/customers/34

答案 1 :(得分:0)

你的方法没有多大意义,为什么你会从以Get ....开头的方法中返回void?

此外,这些路线:

http://example.com/customers/internalId=34
http://example.com/customers/externalId='JohnDoe

从MVC / Web API角度来看是无效的。这就是它们的样子:

http://example.com/customers?internalId=34
http://example.com/customers?externalId=John

默认Web API路由应区分两者并将其路由到不同的操作。

编辑:

使用以下模板创建操作:

[HttpGet]
public string InternalId(int id)
{
    return id.ToString();
}

为Web Api定义路线:

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

这允许你写:

http://localhost:7027/values/internalId=12

试试吧......

然后你可以添加另一种方法:

[HttpGet]
public string ExternalId(string id)
{
    return id;
}

而且:

http://localhost:7027/values/externalId=bob

也可以。

显然,我的控制器的名称是ValuesController,因为我刚刚使用默认的Web Api模板对其进行了测试。