【问题标题】:ASP.Net Web API: Regarding web api action calling url or end point urlASP.Net Web API:关于 web api 动作调用 url 或端点 url
【发布时间】:2016-04-15 13:20:10
【问题描述】:

我是 asp.net web api 的新手。刚刚从这个 url http://www.c-sharpcorner.com/article/remote-bind-kendo-grid-using-angular-js-and-Asp-Net-web-api/阅读了一篇关于 web api 的文章

现在看到这段代码

[RoutePrefix("api/EmployeeList")]  
public class EmployeeDetailsController : ApiController  
{  
    [HttpGet]  
    [Route("List")]  
    public HttpResponseMessage EmployeeList()  
    {  
        try  
        {  
            List<Employee> _emp = new List<Employee>();  
            _emp.Add(new Employee(1, "Bobb", "Ross"));  
            _emp.Add(new Employee(2, "Pradeep", "Raj"));  
            _emp.Add(new Employee(3, "Arun", "Kumar"));  
            return Request.CreateResponse(HttpStatusCode.OK, _emp, Configuration.Formatters.JsonFormatter);  
        }  
        catch (Exception ex)  
        {  
            return Request.CreateResponse(HttpStatusCode.OK, ex.Message, Configuration.Formatters.JsonFormatter);  

        }  


    }  
}  

根据我的理解,请求的 url 应该是 /api/EmployeeList/List,但是如果有人看上面的图片,那么必须注意到不同的 url api/Employee/GetEmployeeList 正在用于调用列表操作方法。所以我只想知道为什么发出不同的 url 来调用 List 操作函数?

也不明白这个 url api/Employee/GetEmployeeList 在这种情况下如何工作,因为控制器名称是 EmployeeDetailsControllerRoutePrefix 已用于解决它 api/EmployeeList 并且操作方法名称是 EmployeeList() 已更改为 List ......所以有人告诉我这个 url api/Employee/GetEmployeeList 如何调用 web api 的列表操作?

请详细讨论。谢谢

【问题讨论】:

  • 控制器名称是 EmployeeDetails 那么我怎么能用 Employee 之类的关键字指向这个控制器......我在这里很困惑?
  • 动作名称是 EmployeeList 那么我怎么能像 GetEmployeeList 一样访问它呢?
  • 你配置属性路由了吗?它可能未配置,因此使用基于约定的路由,例如,如果使用 HttpGet,则 Get 是操作名称的前缀,因此是 GetEmployeeList。建议您阅读更多关于 web api 2 中路由的内容,这里有一个链接asp.net/web-api/overview/web-api-routing-and-actions/…
  • 您的代码和您的 POSTMAN 响应不匹配,返回的用户名不同。你忘了告诉我们一些事情。您的应用程序是否在 Visual Studio 中编译?您是否调用了正确的端点?您确定您没有另一个名为 Employee 的 Controller 吗?也许你重命名了你的控制器并且没有重新编译。
  • 如果你看我的帖子,那么一定会意识到我说我正在学习 web api,并且我还提到了我正在阅读 web api 示例代码的 url。我对邮递员发布的端点网址感到困惑,这就是为什么我问为什么作者在邮递员中使用不同的网址?

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


【解决方案1】:

你激活AttributeRouting了吗?如果没有,则标准路由已就位,您当前的属性将被忽略。

你需要在WebApi注册过程中这样做,像这样:

    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

        // Other Web API configuration not shown.
    }

然后,您可以像这样删除任何方法调用:

config.Routes.MapHttpRoute

禁用常规路由。

顺便说一句,调用 api/Employee/GetEmployeeList 是有效的,因为 Employee 是控制器的名称,Get 是动词,EmployeeList 是方法的名称。

【讨论】:

  • 我的控制器名称是EmployeeDetailsController ,所以当我调用这个控制器时,名称将是 EmployeeDetails......我说的对吗?
  • 我没有测试上面的代码,而是试图理解为什么用户在 post man rest 客户端中发出不同的 url?看看我在我的问题中发布的图片,并告诉我为什么用户在休息客户端发出不同的 url 来测试操作?
  • 是的,应该是。路线部分可能存在某种混乱的配置。删除所有 MapHttpRoute 方法并使用 AttributeRouting,它更容易更清晰。避免这种情况是完美的:) PS:如果你愿意,你也可以发布你的路线部分,我们可以看看!
  • 这是我获取代码的网址c-sharpcorner.com/article/…。看看吧。
【解决方案2】:

您是否启用了属性路由?在 webapiconfig.cs 中默认通过添加以下代码行来执行此操作:

config.MapHttpAttributeRoutes();

【讨论】:

  • 我没有测试上面的代码,而是试图理解为什么用户在 post man rest 客户端中发出不同的 url?看看我在我的问题中发布的图片,并告诉我为什么用户在休息客户端发出不同的 url 来测试操作?
【解决方案3】:

@Monojit-Sarkar。用户在邮递员中显示的 URL 也与代码不匹配。在代码中,这些是我们希望看到的用户:

        _emp.Add(new Employee(1, "Bobb", "Ross"));  
        _emp.Add(new Employee(2, "Pradeep", "Raj"));  
        _emp.Add(new Employee(3, "Arun", "Kumar"));  

但 postman 中的结果与用户发布的图像中显示的不同。所以有些东西与文章/图片和示例代码脱节了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 2014-07-18
    相关资源
    最近更新 更多