So routen Sie zwischen zwei verschiedenen Aktionsmethoden mit denselben Parametern
Ich entwickle ASP.NET Web API 2 mit Attribut-Routing. Ich habe eine Controller-Klasse und zwei Aktionsmethoden:
[RoutePrefix("api/settings")]
public class SettingsController : ApiController
{
[Route("{getVersion}")]
public async Task<IHttpActionResult> GetDBVersion(string PlatformID)
{
try
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
SqlManager sqlManager = new SqlManager();
DataTable dt = sqlManager.GetLocalDBVersion(PlatformID);
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (DataRow dr in dt.Rows)
{
row = new Dictionary<string, object>();
foreach (DataColumn col in dt.Columns)
{
row.Add(col.ColumnName, dr[col]);
}
rows.Add(row);
}
return Ok(serializer.Serialize(rows));
}
catch (Exception ex)
{
return Content(HttpStatusCode.ExpectationFailed, ex.Message);
}
}
[Route("getBookingSetting/{PlatformID:int}")]
public async Task<IHttpActionResult> GetDBBookingSetting(int PlatformID)
{
try
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
SqlManager sqlManager = new SqlManager();
DataTable dt = sqlManager.GetBookingSetting(PlatformID.ToString());
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (DataRow dr in dt.Rows)
{
row = new Dictionary<string, object>();
foreach (DataColumn col in dt.Columns)
{
row.Add(col.ColumnName, dr[col]);
}
rows.Add(row);
}
return Ok(serializer.Serialize(rows));
}
catch (Exception ex)
{
return Content(HttpStatusCode.ExpectationFailed, ex.Message);
}
}
Ich rufe die erste Aktionsmethode per URL auf:
/api/settings/getVersion?PlatformID=1
und zweite von:
/api/settings/getBookingSetting?PlatformID=1
In beiden Fällen wird jedoch jedes Mal die erste Aktionsmethode aufgerufen. Wie kann ich zwischen solchen Fällen routen, in denen Methodennamen unterschiedlich sind, Parameter jedoch denselben Namen und Typ (oder unterschiedliche Typen) haben?
Ihre Routendefinitionen stimmen nicht mit Ihren URLs überein:
[Route("{getVersion}")]
Dies erwartet einen Routenparameter "getVersion", sodass auch URLs wie /api/settings/1
übereinstimmen. Sie sollten es neu schreiben, damit es kein Parameter ist:
[Route("getVersion")]
public async Task<IHttpActionResult> GetDBVersion([FromUri]string PlatformID)
Nächster:
[Route("getBookingSetting/{PlatformID:int}")]
Diese Definition wird PlatformID
als Teil der Route (dh /api/settings/getBookingSetting/1
) erwartet , aber Sie übergeben sie als Abfragezeichenfolge.
Sie sollten die Definition folgendermaßen ändern:
[Route("getBookingSetting")]
public async Task<IHttpActionResult> GetDBBookingSetting([FromUri]int PlatformID)