1

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

GET 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 的路由功能来实现这一点。

4

2 回答 2

1

我建议你尽量避免做你建议的事情。为同一个资源创建两个不同的 URI 会增加使用缓存的难度。相反,我建议使用一个 URL 重定向到另一个。

例如

> GET /customers/34
< 200 OK


> GET /Customers?name=JohnDoe
< 303 See Other
< Location: http://example.com/customers/34
于 2013-03-19T01:43:31.667 回答
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 模板对此进行了测试。

于 2013-03-18T21:35:16.303 回答