我可以在web api中使用非Rest样式方法吗?

时间:2015-04-03 17:03:34

标签: asp.net-web-api

我的问题特别是如果我可以支持这样的事情

public class SomeTestController : ApiController
    {


        [System.Web.Http.AcceptVerbs("GET")]
        public SomeInfo GetSomeBlah(int a, int b)
        {
            return new SomeInfo 
            {
                Name = string.Format("GetSomeBlah - {0}", a),
                CompanyID = b.ToString()

            };
        }

        [System.Web.Http.AcceptVerbs("GET")]
        public SomeInfo GetSomeBlah1(int a, int b)
        {
            return new SomeInfo 
            {
                Name = string.Format("GetSomeBlah1 - {0}", a),
                CompanyID = b.ToString()

            };
        }

    }

我尝试添加以下路线

config.Routes.MapHttpRoute(
        name: "DefaultApi4",
        routeTemplate: "api/{controller}/{action}",
        defaults: new {action = RouteParameter.Optional}
        );

编辑:2015年4月7日

我忘了提到它也应该与其他风格的方法一起使用。

4 个答案:

答案 0 :(得分:1)

不确定为什么要这样做,听起来你误解了路由是如何工作的 - 你有关于路由的seen these tutorials以及ASP.net如何映射路由吗?

从下面的3b点开始,这意味着如果您更有意义地命名输入变量,框架将能够映射来自路径的名称和类型,以确定选择哪种方法,即getSomeBlah或GetSomeBlack1

其他人的摘要,

  

1)。创建控制器上与HTTP请求方法匹配的所有操作的列表。

     

2)。如果路线词典有"动作"输入,删除名称与此值不匹配的操作。

     

3)。尝试将操作参数与URI匹配,如下所示:

     

A)。对于每个操作,获取一个简单类型的参数列表,其中绑定从URI获取参数。排除可选参数。

     

B)。从此列表中,尝试在路径字典或URI查询字符串中查找每个参数名称的匹配项。匹配不区分大小写,不依赖于参数顺序。

     

C)。选择列表中的每个参数在URI中都匹配的操作。

     

d)。如果多一个操作符合这些条件,请选择参数匹配最多的一个。

     

4)。使用[NonAction]属性忽略操作。

答案 1 :(得分:0)

如果删除默认路由,那将会有效。我还指出了参数的来源。

指定输入来自URL:

public SomeInfo GetSomeBlah([FromUri] int a, [FromUri] int b)

评论或删除此内容:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

测试网址:

  

http://localhost:64719/api/Values/GetSomeBlah?a=1&b=2

响应:

<ValuesController.SomeInfo xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/SampleMVC.Controllers"> <CompanyID>2</CompanyID><Name>GetSomeBlah - 1</Name> </ValuesController.SomeInfo>

答案 2 :(得分:0)

像这样配置:

        config.Routes.MapHttpRoute("DefaultApi2", 
          "apiws/{controller}/{action}/{id}", 
           new { id = RouteParameter.Optional });

        config.Routes.MapHttpRoute("DefaultApi", 
         "apiws/{controller}/{id}", 
         new { id = RouteParameter.Optional });

这适用于休息风格和非休息风格apis。 请注意,这两个语句的顺序很重要。

答案 3 :(得分:0)

我设法使用以下代码

    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

和属性路由。

    [RoutePrefix("api/someother")]
    public class SomeOtherController : ApiController
    {
        // GET: api/SomeOther
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

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

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

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

        [System.Web.Http.HttpGet()]
        [System.Web.Http.Route("Findsomething2")]
        public CompanyInfo Findsomething2(int id, int b)
        {
            return new CompanyInfo
            {
                CompanyID = b.ToString(),
                Name = id.ToString() + " 2"

            };
        }

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