3

我有一個簡單WebApi2控制器返回XML,但我不能用我定義了路由適當加另一種方法:需要的路線爲我的網頁API 2控制器

namespace CBMI.WebAPIservice.Controllers 
{ 
public class MarkersController : ApiController 
{ 
    public HttpResponseMessage Get(int? id) 
    { 
     int i = id.HasValue ? id.Value : 0; 
     XmlDocument docContent = GetXmlDataFromDB(i); 
     return new HttpResponseMessage 
     { 
      Content = new StringContent(docContent.InnerXml.ToString(), Encoding.UTF8, "application/xml") 
     }; 
    } 
    public HttpResponseMessage GetGrantsIS() 
    { 
     XmlDocument docContent = GetXmlDataFromDB(); 
     return new HttpResponseMessage 
     { 
      Content = new StringContent(docContent.InnerXml.ToString(), Encoding.UTF8, "application/xml") 
     }; 

    } 
    public XmlDocument GetXmlDataFromDB() 
    { 
     string connStr = System.Convert.ToString(
       System.Web.Compilation.ConnectionStringsExpressionBuilder.GetConnectionString("MDWConnectionString"), 
       System.Globalization.CultureInfo.CurrentCulture); 
     SqlConnection conn = new SqlConnection(connStr); 
     SqlCommand sqlCmd = new SqlCommand("dbo.FLAS_List_GrantLocationsByAmount_V1", conn); 
     sqlCmd.CommandType = System.Data.CommandType.StoredProcedure; 
     conn.Open(); 
     XmlDocument xmlDoc = new XmlDocument(); 
     XmlReader xmlReader = sqlCmd.ExecuteXmlReader(); 
     if (xmlReader.Read()) 
      xmlDoc.Load(xmlReader); 
     conn.Close(); 
     return xmlDoc; 
    } 
    public XmlDocument GetXmlDataFromDB(int worldAreaID) 
    { 
     string scrambleAward = ""; 
     string connStr = System.Convert.ToString(
       System.Web.Compilation.ConnectionStringsExpressionBuilder.GetConnectionString("MDWConnectionString"), 
       System.Globalization.CultureInfo.CurrentCulture); 
     SqlConnection conn = new SqlConnection(connStr); 
     SqlCommand sqlCmd = new SqlCommand("dbo.FLAS_List_Awards_V1", conn); 
     sqlCmd.CommandType = System.Data.CommandType.StoredProcedure; 
     sqlCmd.Parameters.AddWithValue("@AreaID", worldAreaID); 
     sqlCmd.Parameters.AddWithValue("@Scramble", scrambleAward); 
     conn.Open(); 
     XmlDocument xmlDoc = new XmlDocument(); 
     XmlReader xmlReader = sqlCmd.ExecuteXmlReader(); 
     if (xmlReader.Read()) 
      xmlDoc.Load(xmlReader); 
     conn.Close(); 
     return xmlDoc; 
    } 

} 

}

WebApiConfig.cs

namespace CBMI.WebAPIservice.App_Start 
{ 
// This code file defines the delegate where you should put your Web API configuration code. 

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

     config.Routes.MapHttpRoute 
      (
       name: "WebApi2", 
       routeTemplate: "api/{controller}/{id}" 
      ); 
     config.Routes.MapHttpRoute 
      (
       name: "ApiGrantsIS", 
       routeTemplate: "api/{controller}/{action}" 
      ); 
    } 
} 

}

I C注意瞭解如何更改路由以識別動作,以便調用方法。而是使用以下URL進行瀏覽

CBMI.WebAPIservice/api/markers/GetGrantsIS 

通過Get方法識別該ID沒有值的路由。它然後默認值爲0,它的工作原理,但我需要這個URL調用GetGrantsIS方法。

編輯:嘗試添加屬性路由賦予了新的錯誤

我飾如下:

[Route("api/{controller}/GetGrantsIS")] 
    public HttpResponseMessage GetGrantsIS() 

,現在我得到這樣的:

Server Error in '/CBMI.WebAPIservice' Application. 
 

 
A direct route cannot use the parameter 'controller'. Specify a literal path in place of this parameter to create a route to a controller.

+0

您應該使用RouteAttribute包括在同一控制器的多條途徑獲取。 https://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 Theres不需要改變地圖路線。 – Fals

回答

3

Web Api 2支持REST架構,這意味着它期望您的操作爲GET,POST,PUT,DELETE。

但是,您可以使用attribute routing來獲得所需的結果。

如果你想使用屬性路由,你已經在你的WebApiConfig文件中有該設置。所以,你只需要修改代碼以使用路由屬性,像這樣:

[Route("api/markers/getgrantsis")] 
public HttpResponseMessage GetGrantsIS() 
{ 
    XmlDocument docContent = GetXmlDataFromDB(); 
    return new HttpResponseMessage 
    { 
    Content = new StringContent(docContent.InnerXml.ToString(), Encoding.UTF8, "application/xml") 
    }; 

} 
+0

謝謝;這現在起作用。關於你提出的REST評論,我想如果我的方法以Get ..開頭(如上面的GetGrantsIS),那麼它可以在不使用屬性路由的情況下解決。我想到了與一個新的控制器完全接近。 –

+0

這是真的,但它不會更改URL。例如,您可以使用GetGrantsIS()並通過/ api/markers /訪問它,但它不能通過/ api/markers/GetGrantsIs訪問。在第二種情況下,框架將嘗試將GetGransIS解析爲Id字段的int,或者完全忽略它。如果你想要通過URL訪問自定義get方法,最好的選擇就是屬性路由。希望這是有道理的。 – Woot

相關問題