Użyłem ramy ASP.NET MVC
. W tym kontekście sprawdziliśmy każde przychodzące żądanie (adres URL) pod kątem jakiegoś klucza i przypisaliśmy go do właściwości. Stworzyliśmy niestandardową klasę, która wywodzi się z Controller
klasy &, , zastępującOnActionExecuting()
, aby zapewnić naszą niestandardową logikę.Czytanie każdego przychodzącego żądania (adresu URL) w ASP.NET WEB API
Jak możemy osiągnąć to samo w ASP.NET WEB API?
//Implementation from ASP.NET MVC
public class ApplicationController : Controller
{
public string UserID { get; set; }
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!string.IsNullOrEmpty(Request.Params["uid"]))
UserID = Request.Params["uid"];
base.OnActionExecuting(filterContext);
}
}
Co Próbowałem w ASP.NET Web API: - Choć to działa, zastanawiam się, czy to jest prawidłowe podejście?
Utworzono podstawowy kontroler
public class BaseApiController : ApiController
{
public string UserID { get; set; }
}
stworzyła kolejną klasę, która dziedziczy ActionFilterAttribute klasę & zastąpić OnActionExecuting()
public class TokenFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
var queryString = actionContext.Request.RequestUri.Query;
var items = HttpUtility.ParseQueryString(queryString);
var userId = items["uid"];
((MyApi.Data.Controllers.BaseApiController)(actionContext.ControllerContext.Controller)).UserID = userId;
}
}
teraz zarejestrować tej klasy
public static void Register(HttpConfiguration config)
{
config.Filters.Add(new TokenFilterAttribute());
}
Dziękujemy za szybką pomoc. Przed opublikowaniem pytania sprawdzałem ten adres URL i nie wiem, w jaki sposób to pomoże w moim przypadku. Czy możesz podać mi więcej szczegółów. – SharpCoder
Próbowałem dodać trochę kodu i uczynić go bardziej zrozumiałym. Jaki jest twój przypadek użycia? Dlaczego potrzebujesz wyodrębnić identyfikator użytkownika z każdego żądania? – Regfor
Niektóre z żądań będą miały wartość 'userId' przekazywaną jako ciąg zapytania. Chcę tylko sprawdzić każde żądanie i jeśli ciąg zapytania ma wartość 'userId', odczytam go i przypisze do właściwości' UserID' w 'BaseController'. 'BaseController' będzie dziedziczyć po' ApiController'. I wszystkie moje kontrolery odziedziczą po 'BaseController'. Który zapewni właściwość 'UserID' jest dostępna dla wszystkich kontrolerów. Problem polega na tym, że "DelegatingHandler" jest także klasą, w przeciwieństwie do interfejsu 'IActionFilter' który jest dostępny w ASP.NET MVC – SharpCoder