简体   繁体   English

需要我的web api 2控制器的路由

[英]need route for my web api 2 controller

I have a simple WebApi2 controller that returns XML but I cannot add another method properly with the routing I have defined: 我有一个简单的WebApi2控制器,它返回XML,但我无法使用我定义的路由正确添加另一个方法:

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 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 cannot understand how to change the routing to recognize the action such that the GetGrantsIS method is invoked. 我无法理解如何更改路由以识别操作 ,以便调用GetGrantsIS方法。 Instead, browsing with the following URL 而是使用以下URL浏览

CBMI.WebAPIservice/api/markers/GetGrantsIS

routes to the Get method which recognizes that id has no value. 路由到Get方法,该方法识别id没有值。 It then defaults to a value of 0 and it works but I need to have this URL invoke the GetGrantsIS method. 然后它默认值为0并且它可以工作,但是我需要让这个URL调用GetGrantsIS方法。

EDIT: attempt to add Attribute Routing gives new error 编辑:尝试添加属性路由给出新的错误

I decorated as follows: 我装饰如下:

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

and now I get this: 现在我明白了:

 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. 

Web Api 2 favors REST architecture, meaning it expects your actions to be GET, POST, PUT, DELETE. Web Api 2支持REST架构,这意味着它希望您的操作是GET,POST,PUT,DELETE。

However you can get your desired results using attribute routing . 但是,您可以使用属性路由获得所需的结果。

If you wanted to use attribute routing you already have that setup in your WebApiConfig file. 如果要使用属性路由,则已在WebApiConfig文件中进行了该设置。 So you would just need to modify your code to use the Route attribute like so: 因此,您只需修改代码即可使用Route属性,如下所示:

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

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM