【问题标题】:unable to call web api using custom methods无法使用自定义方法调用 web api
【发布时间】:2016-11-16 06:23:37
【问题描述】:

我遵循了一些答案,但在邮递员上收到以下错误

{ "Message": "The requested resource does not support http method 'GET'." }

这些是我关注的链接

Web API route to action name

How to add custom methods to ASP.NET WebAPI controller?

目前的设置就像 sky-dev 描述的那样

Custom method names in ASP.NET Web API

已更新代码

webapiconfig.cs

public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        // Configure Web API to use only bearer token authentication.
        //config.SuppressDefaultHostAuthentication();
        //config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        //// Web API routes
        //config.MapHttpAttributeRoutes();

        //config.Routes.MapHttpRoute(
        //    name: "DefaultApi",
        //    routeTemplate: "api/{controller}/{id}",
        //    defaults: new { id = RouteParameter.Optional }
        //);
        config.Routes.MapHttpRoute("DefaultApiWithId", "api/{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" });
        config.Routes.MapHttpRoute("DefaultApiWithAction", "api/{controller}/{action}");
        config.Routes.MapHttpRoute(name: "ApiWithActionName",routeTemplate: "api/{controller}/{action}/{id}",defaults: new { id = RouteParameter.Optional });
        config.Routes.MapHttpRoute("DefaultApiGet", "api/{controller}", new { action = "Get" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });
        config.Routes.MapHttpRoute("DefaultApiPost", "api/{controller}", new { action = "Post" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) });

    }

defaultcontroller.cs

public class DefaultController : ApiController
{
    DBEntities db = new DBEntities();
    public IEnumerable<CategoryDTO> Category()
    {
        IEnumerable<CategoryDTO> List = from tr in db.Categories
                                                  where tr.IsActive == "Y"
                                                  orderby tr.DisplayOrder ascending
                                                  select new CategoryDTO()
                                                  {
                                                      Id = tr.Id,
                                                      Name = tr.Name
                                                  };
        return List;
    }
    // GET: api/Default
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET: api/Default/5
    public string Get(int id)
    {
        return "value";
    }

    // POST: api/Default
    public void Post([FromBody]string value)
    {
    }

    // PUT: api/Default/5
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE: api/Default/5
    public void Delete(int id)
    {
    }


}

【问题讨论】:

  • 你用[HttpGet]装饰了吗?
  • 是的,我做到了,它正在使用它,但我在其中一个项目中看到它没有用 [HttpGet] 装饰,但它正在工作..
  • 需要查看您的代码以进行调试。
  • 我推荐这篇文章exceptionnotfound.net/…在它的中间,作者解释了ASP.NET如何找到一个动作的默认方法
  • 能否发布您输入的 URL 以访问您的 API?

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


【解决方案1】:

如果您使用的是 web api 2,那么您可以使用属性路由 关注这个网址,希望你能得到答案

示例:

[Route("customers/{customerId}/orders")]
public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }

要了解更多详情,请点击此链接 http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

还有另一种方法可以通过在 WebApiConfig.cs 中编写自己的路由来使用自定义方法 您可以在此链接中找到此详细信息 http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

希望这会对你有所帮助。

【讨论】:

  • 嗨,利雅得..感谢您的建议,我在文章中有一个,但是否可以使用不加装饰的自定义方法?
  • 是的,有可能:关注此网址asp.net/web-api/overview/web-api-routing-and-actions/…
  • 谢谢你!你让我很开心..现在我对路由有更多的控制权..竖起大拇指!
  • 我很高兴,我的 ans 可以帮助你。
猜你喜欢
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 2018-04-23
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多