【问题标题】:How to change the way REST Web API is called for ASP.NET如何更改为 ASP.NET 调用 REST Web API 的方式
【发布时间】:2014-08-13 22:19:06
【问题描述】:

我的控制器目前看起来像:

[Jsonp filter] 
public class ProductController : Controller
{

     public Json GetProduct(string id)
     {
          Product x;
          //code
          return Json(x, JsonRequestBehavior.AllowGet);
     }
 }

我可以得到这样的产品: api/product/getproduct/5

但是,我希望能够像这样访问它: api/product/5

我需要做哪些改变才能做到这一点?

编辑:我实际上正在使用 Jsonp,因为我需要从不同的域调用此 API 并返回一个 json 对象。这可以使用 ApiController 吗?否则有没有办法在不切换到 ApiController 的情况下做到这一点?

【问题讨论】:

    标签: c# asp.net asp.net-mvc web asp.net-web-api


    【解决方案1】:

    您必须编辑您的 webapiconfig(位于 App_Start 文件夹中)。

    您需要在任何其他路线之前添加类似的内容(以确保首先捕获它):

    // Map Http Route takes in 3 parameters below
    // param 1 is the name of the route.. This has nothing to do with class names or method names
    // param 2 is the route itself.  Route parameters are denoted in curly braces {likethis}
    // param 3 sets up defaults
    config.Routes.MapHttpRoute("GetProductApi", "api/product/{id}",
        new {
            controller = "Product",      // the name of the controller class (without the Controller suffix)
            action = "GetProduct",       // the name of your method
            id = RouteParameter.Optional
        });
    

    此外,您的控制器代码看起来不是 API 控制器。无论如何,这是一个路由问题。如果您 100% 需要,您可以在常规路由配置中添加路由配置。

    【讨论】:

    • 我很困惑为什么这甚至是必要的。如果这是唯一的 GET 操作,默认路由应该允许您跳过 URL 的 /getproduct/ 部分。
    • 我认为他需要将GetProduct 方法名称更改为Get?也许他需要添加[HttpGet] 方法属性?无论哪种方式,添加特定路线都会让他到达那里(并不是最好的解决方案)。
    • 嗯,我试过了,但它似乎不起作用..我添加了你输入的内容,除了将“GetProductApi”更改为我的实际 Api 的名称
    • 您可能需要为控制器设置一个默认值。查看编辑
    【解决方案2】:

    您上面的代码不是 WebApi 控制器,而是 MVC 控制器。您的类需要从 ApiController 继承,而不是像:

    public class ProductController : ApiController{
    ...
    

    关于您的方法,我不确定您为什么使用 Json 作为返回类型,因为它是定义返回格式的 MediaFormatter 配置的一部分,不应在方法/函数级别定义它。 看起来正确的方法声明是这样的:

    public Product GetProduct(string id)
    {
       Product x; //probably you want initialize it like new Product();       
       return x;
    }
    

    更新 JsonP

    WebApi 基于 MediaFormatters 工作,如前所述。为了使用 JsonP,您需要使用正确的媒体格式化程序,有几个,但是怎么样:

    http://www.nuget.org/packages/WebApi.JsonP

    如果您想了解更多关于 WebApi 的 JsonP 格式化程序的信息,这里有一篇关于此的 SO 帖子:

    【讨论】:

    • 我实际上必须使用 JsonP,因为我正在从不同的域访问此 API,我将更新问题以包含此内容。有没有办法在不更改为 ApiController 的情况下做到这一点,因为我认为 APIController 不支持 JsonP?
    • 我猜这是正确的方法,但我现在无法选择切换它。无论如何我都会将其标记为正确的..
    【解决方案3】:

    您的ProductController 应该派生自ApiController,而不是Controller

    【讨论】:

      【解决方案4】:

      以@Dalorzo 的回答为基础,如果/何时可以转换为 APIController,并且如果可以使用 WebAPI 2,则可以在方法上使用 decorator attributes,这将改变路由甚至 HTTP 动词用于方法...这真的很好,因为您需要了解的有关该 API 调用的所有信息都在函数签名处。它非常强大且直观,我强烈推荐它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-21
        • 2013-06-04
        • 2015-01-27
        • 1970-01-01
        • 1970-01-01
        • 2012-09-29
        相关资源
        最近更新 更多