c# - varios - se encontraron varias acciones que coincidían con la solicitud web api
¿Por qué mi ASP.NET Web API ActionFilterAttribute OnActionExecuting no se activa? (6)
Aquí está la Implementación completa:
public class AllowCrossSiteJsonAttribute : System.Web.Mvc.ActionFilterAttribute
{
public override void OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext)
{
if (filterContext.HttpContext != null && filterContext.HttpContext.Response != null && filterContext.HttpContext.Request != null && filterContext.HttpContext.Request.UrlReferrer != null)
{
var allowedCrossDomains = TypeSafeConfigurationManager.GetValueString("allowedCrossDomains", "none");
var allowedHosts = allowedCrossDomains.Split('','');
var requestHost = filterContext.HttpContext.Request.UrlReferrer.GetLeftPart(UriPartial.Authority);
if (allowedHosts.Contains(requestHost.ToLower()))
{
filterContext.HttpContext.Response.Headers.Add("Access-Control-Allow-Origin", requestHost);
}
}
base.OnActionExecuted(filterContext);
}
}
public class AllowCrossSiteJsonForWebApiAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Response != null && actionExecutedContext.Request != null &&
actionExecutedContext.Request.Headers.Referrer != null)
{
var allowedCrossDomains = TypeSafeConfigurationManager.GetValueString("allowedCrossDomains", "none");
var allowedHosts = allowedCrossDomains.Split('','').ToList();
var requestHost = actionExecutedContext.Request.Headers.Referrer.GetLeftPart(UriPartial.Authority);
if (allowedHosts.Contains(requestHost.ToLower()))
{
actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", requestHost);
}
base.OnActionExecuted(actionExecutedContext);
}
}
}
Estoy tratando de implementar lo que se ve aquí: http://www.piotrwalat.net/nhibernate-session-management-in-asp-net-web-api/ pero tengo un problema con mi NhSessionManagementAttribute
.
Establecí puntos de interrupción en mi OnActionExecuting(HttpActionContext actionContext)
para ver si alguna vez se llamaba a la función, no.
Comprobé dos global.asax.cs
mi archivo global.asax.cs
y descubrí que estoy registrando ActionFilter
con:
GlobalConfiguration.Configuration.Filters.Add(new NhSessionManagementAttribute());
También decoré tanto mi clase de controlador en sí, como sus acciones con el atributo en vano:
public class ClientsController : ApiController {
static readonly ClientRepository repository = new ClientRepository();
[NhSessionManagement]
public IEnumerable<Client> GetAllClients() {
return repository.GetAll();
}
[NhSessionManagement]
public Client GetClient(int id) {
Client client = repository.Get(id);
if (client == null) {
throw new HttpResponseException(
new HttpResponseMessage(HttpStatusCode.NotFound)
);
}
return client;
}
}
¿Por qué este filtro de acción no activará ninguno de los eventos dentro?
La respuesta anterior definitivamente me ayudó a salvar a los demás un tiempo ... aquí está explícitamente la diferencia.
Los controladores MVC estándar usan:
// System.Web.Mvc
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
}
Los controladores HTTP OData usan:
// System.Web.Http.Filters;
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
base.OnActionExecuted(actionExecutedContext);
}
Mi problema era mucho más simple:
Compruebe que su controlador esté decorado con <actionPreProcessActivitiesAttribute()> _
Para WebApi, debe instalar Microsoft.AspNet.WebApi.Core de nuget. Para MVC puede usar System.Web.MVC.
Para cualquier otra persona que se encuentre con esto, ActionFilterAttribute no se activará cuando se llame a YourController.YourAction desde UnitTest.
[TestMethod]
public void RevokeSiteAdmin_SessionOver()
{
FakeDbContext db = new FakeDbContext();
YourController controller = new YourController(db);
var result = controller.YourAction();
//Some Assertions
}
En el TestMethod anterior, no se invocará ningún ActionFilterAttributes en YourController.YourAction. Sin embargo; si llama a YourController.YourAction desde un navegador, se llamará a su ActionFilterAttribute.
Esto es cierto para al menos WebApi, pero no sé si se aplica a MVC.
Si está trabajando en un proyecto que contiene tanto montajes MVC como WebAPI, podría verificar cuál es el espacio de nombres del espacio de nombres de su ActionFilterAttribute. Es bastante confuso porque hay dos ActionFilterAttributes en ambos:
- WebAPI: System.Web.Http.Filters
- MVC: System.Web.Http.Mvc