Ich versuche zu implementieren, was hier zu sehen ist: http://www.piotrwalat.net/nhibernate-session-management-in-asp-net-web-api/, aber ich habe ein Problem mit meinem NhSessionManagementAttribute
.
Ich habe auf meinem Haltepunkt gesetzt, um OnActionExecuting(HttpActionContext actionContext)
zu sehen, ob die Funktion jemals aufgerufen wurde - war es nicht.
Ich habe meine global.asax.cs
Datei noch einmal überprüft und festgestellt, dass ich die Datei tatsächlich registriere ActionFilter
mit:
GlobalConfiguration.Configuration.Filters.Add(new NhSessionManagementAttribute());
Ich habe auch sowohl meine Controller-Klasse selbst als auch ihre Aktionen mit dem Attribut ohne Erfolg dekoriert:
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;
}
}
Warum würde dieser Aktionsfilter keines der darin enthaltenen Ereignisse auslösen?
quelle
Die obige Antwort hat mir definitiv geholfen - anderen Zeit zu sparen ... hier ist ausdrücklich der Unterschied.
Standard-MVC-Controller verwenden:
// System.Web.Mvc public override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); }
OData HTTP-Controller verwenden:
// System.Web.Http.Filters; public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { base.OnActionExecuted(actionExecutedContext); }
quelle
Für alle anderen, die darauf stoßen, wird ActionFilterAttribute nicht ausgelöst, wenn Sie YourController.YourAction von Ihrem UnitTest aus aufrufen.
[TestMethod] public void RevokeSiteAdmin_SessionOver() { FakeDbContext db = new FakeDbContext(); YourController controller = new YourController(db); var result = controller.YourAction(); //Some Assertions }
In der obigen Testmethode werden keine ActionFilterAttributes auf YourController.YourAction aufgerufen. Jedoch; Wenn Sie YourController.YourAction über einen Browser aufrufen, wird Ihr ActionFilterAttribute aufgerufen.
Dies gilt zumindest für WebApi, aber ich weiß nicht, ob dies für MVC gilt.
quelle
Hier ist die vollständige Implementierung:
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); } } }
quelle
Für WebApi sollten Sie Microsoft.AspNet.WebApi.Core von Nuget installieren. Für MVC können Sie System.Web.MVC verwenden.
quelle
Mein Problem war viel einfacher:
Überprüfen Sie, ob Ihr Controller mit dekoriert ist
<actionPreProcessActivitiesAttribute()> _
quelle