3

У меня есть простой контроллер WebApi2, который возвращает XML, но я не могу добавить еще один способ правильно с маршрутизацией я определила:нужен маршрут для моего веб-апи 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 не могут понять, как изменить маршрутизацию, чтобы распознать действие так, что вызывается метод GetGrantsIS. Вместо этого просматривается следующий URL-адрес:

маршруты к методу Get, который распознает, что идентификатор не имеет значения. Затем значение по умолчанию равно 0, и оно работает, но мне нужно, чтобы этот URL вызывал метод GetGrantsIS.

EDIT: попытка добавить атрибут Routing дает новую ошибку

Я украсил следующим образом:

[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 для включения нескольких маршрутов Get на том же контроллере. https://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2. Нет необходимости менять маршрут карты. – Fals

ответ

3

Web Api 2 поддерживает архитектуру REST, то есть ожидает, что ваши действия будут GET, POST, PUT, DELETE.

Однако вы можете получить желаемые результаты, используя attribute routing.

Если вы хотите использовать маршрутизацию атрибутов, у вас уже есть эта настройка в файле WebApiConfig. Таким образом, вам просто нужно будет изменить свой код, чтобы использовать атрибут Route следующим образом:

[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 на int для поля Id или вообще игнорировать его. Если вы хотите, чтобы пользовательские методы получения, доступные через URL-адреса, лучшим вариантом является маршрутизация атрибутов. Надеюсь, это имеет смысл. – Woot