Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要帮助调用Web Api控制器方法来检索数据吗_C#_Asp.net Web Api_Asp.net Web Api Routing - Fatal编程技术网

C# 需要帮助调用Web Api控制器方法来检索数据吗

C# 需要帮助调用Web Api控制器方法来检索数据吗,c#,asp.net-web-api,asp.net-web-api-routing,C#,Asp.net Web Api,Asp.net Web Api Routing,我不熟悉Web Api(这里可能缺少一些非常简单的东西)我有一个带有ProductsController.cs的Web Api项目,该项目的属性类型为List,我只想在浏览器中调用Api,例如localhost/Api/products/1或/Api/products/getproduct/1,以检索url中指定Id的产品响应,但我无法获取任何响应数据。每次都会出现“未找到”错误。我缺少什么来让它找到数据并检索响应 我尝试了以下方法: public IHttpActionResult Get(i

我不熟悉Web Api(这里可能缺少一些非常简单的东西)我有一个带有
ProductsController.cs
的Web Api项目,该项目的属性类型为
List
,我只想在浏览器中调用Api,例如
localhost/Api/products/1
/Api/products/getproduct/1
,以检索url中指定Id的产品响应,但我无法获取任何响应数据。每次都会出现“未找到”错误。我缺少什么来让它找到数据并检索响应

我尝试了以下方法:

public IHttpActionResult Get(int id)
{
    var product = products.FirstOrDefault(p => p.Id == id);
    if (product == null)
    {
        return NotFound();
    }
    else
    {
        return Ok(product);
    }
}
甚至以下仍然返回未找到的内容:

public string Get(int id)
{
   return "product test";
}

确保路由配置正确

WebApiConfig.cs

public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        // Attribute routing.
        config.MapHttpAttributeRoutes();

        // Convention-based routing.
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}
从那里,您有两个选择路由到操作

以公约为基础

public class ProductsController : ApiController {

    //...constructor code removed for brevity

    [HttpGet] // Matches GET api/products
    public IHttpActionResult GetAllProducts() {
        return Ok(products);
    }

    [HttpGet] // Matches GET api/products/1
    public IHttpActionResult GetProduct(int id) {
        var product = products.FirstOrDefault(p => p.Id == id);
        if (product == null) {
            return NotFound();
        } 
        return Ok(product);
    }
}
或属性路由

[RoutePrefix("api/products")]
public class ProductsController : ApiController {

    //...constructor code removed for brevity

    [HttpGet]
    [Route("")] // Matches GET api/products
    public IHttpActionResult GetAllProducts() {
        return Ok(products);
    }

    [HttpGet]
    [Route("{id:int}")] // Matches GET api/products/1
    public IHttpActionResult GetProduct(int id) {
        var product = products.FirstOrDefault(p => p.Id == id);
        if (product == null) {
            return NotFound();
        } 
        return Ok(product);
    }
}

在您的方法上面,您需要添加如下内容:
[HttpPost][Route(“~/api/products/”)
我也不知道这些行的名称,不过…@MauricioAriasOlave感谢您的评论。我想这叫做属性路由。谢谢你的回答,我稍后会试试。就最佳实践而言,使用属性路由方法还是基于约定的方法更好?如果两者同时使用会发生什么情况?@Theomax这完全取决于开发者的偏好。每种选择都有其利弊。应用程序可以跨多个控制器利用/混合这两个选项。但是,单个控制器使用基于约定的路由或属性路由。将[HttpGet]添加到GetProducts(int id)对于URL/api/products/1是有效的,尽管我不明白为什么,因为它没有引用该方法名称,而事实上它是一个接受int参数的HttpGet方法。我尝试对一个名为GetAllProducts()的方法执行相同的操作,该方法应返回整个产品集合,但是显然它不能用/api/products/GetAllProducts调用-我需要在routeconfig中映射它吗?@Theomax因为控制器中有多个GET,所以必须在两个操作
GetAllProducts
GetProducts
上指定
HttpGet
GetAllProducts
将映射到“/api/products”,因为
{id}
是可选的
GetProducts(intid)
将映射到`/api/products/1`