【问题标题】:asp.net webapi url to identify same resource用于识别相同资源的 asp.net webapi url
【发布时间】:2013-03-19 22:09:25
【问题描述】:

我希望能够通过不同的 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 的路由功能来实现这一点。

【问题讨论】:

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


    【解决方案1】:

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

    例如

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

    【讨论】:

    • 谢谢达伦。我以前看过这个答案。我正在尝试执行此处链接的操作:developer.linkedin.com/documents/profile-api 并想知道 WebApi 是否可以进行此类路由。
    • @darthjit 当然可以使用 WebAPI,因为您可以替换路由组件并自己实现它。现有的路由机制是否可以做到,我不知道,因为我永远不会尝试做这样的事情。使用波浪号返回“当前配置文件”对于 Linked in 来说是一件特别愚蠢的事情。
    【解决方案2】:

    您的方法没有多大意义,为什么要从以 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 模板对此进行了测试。

    【讨论】:

    猜你喜欢
    • 2014-09-12
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2021-08-26
    相关资源
    最近更新 更多