2015-04-03 51 views
1

我的問題,具體爲,如果我能支持這樣的事情我可以在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} 
     ); 

編輯:15年4月7日

我忘了提及它應該也適用於休息風格的方法。

回答

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) 
     { 
     } 
    } 
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> 
0

不知道爲什麼你正在試圖做到這一點,這聽起來像你誤會是如何工作的路由 - 你有沒有在路由seen these tutorials和ASP.net如何映射路線?

從下面這一點3B意味着,如果你的名字你輸入變量下的更有意義,框架就能地圖上的名稱和類型從路線進來,以何種方法來挑選,即getSomeBlah或GetSomeBlack1

對他人的摘要,

1)。創建控制器上與HTTP請求方法匹配的所有操作的列表。 2)。如果路由字典中有「動作」條目,則刪除名稱與此值不匹配的動作。 3)。嘗試將動作參數與URI匹配,如下所示:

a)。對於每個操作,獲取一個簡單類型的參數列表,其中綁定從URI獲取參數。排除可選參數。 b)。從該列表中,嘗試爲路由字典或URI查詢字符串中的每個參數名稱找到匹配項。匹配不區分大小寫,不依賴於參數順序。 c)。選擇列表中每個參數在URI中都匹配的操作。

d)。如果更多的行爲符合這些標準,請選擇參數匹配最多的行爲。 4)。使用[NonAction]屬性忽略動作。

0

,將其配置是這樣的:

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

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

這同時適用於其他風格和非休息風格的API。 請注意,這兩個語句的順序很重要。

相關問題