我正在尝试实施此处显示的内容:http://www.piotrwalat.net/nhibernate-session-management-in-asp-net-web-api/但我的NhSessionManagementAttribute
存在问题。
我在我的OnActionExecuting(HttpActionContext actionContext)
上设置了断点,以查看该函数是否被调用 - 它不是。
我仔细检查了我的global.asax.cs
文件&发现我实际上正在注册ActionFilter
:
GlobalConfiguration.Configuration.Filters.Add(new NhSessionManagementAttribute());
我还装饰了我的控制器类本身,以及它对属性的操作无济于事:
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;
}
}
为什么此操作过滤器不会触发其中的任何事件?
答案 0 :(得分:148)
如果您正在一个包含MVC和WebAPI组件的项目中工作,您可以查看ActionFilterAttribute命名空间的命名空间。这是相当令人困惑的,因为在两者下都有两个ActionFilterAttribute:
答案 1 :(得分:33)
上面的答案肯定对我有所帮助 - 拯救他人一段时间......这里明确区别了。
标准MVC控制器使用:
// System.Web.Mvc
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
}
OData HTTP控制器使用:
// System.Web.Http.Filters;
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
base.OnActionExecuted(actionExecutedContext);
}
答案 2 :(得分:4)
对于遇到此问题的任何其他人,从UnitTest调用YourController.YourAction时,ActionFilterAttribute将不会触发。
[TestMethod]
public void RevokeSiteAdmin_SessionOver()
{
FakeDbContext db = new FakeDbContext();
YourController controller = new YourController(db);
var result = controller.YourAction();
//Some Assertions
}
在上面的TestMethod中,不会调用YourController.YourAction上的任何ActionFilterAttributes。然而;如果从浏览器调用YourController.YourAction,将调用ActionFilterAttribute。
至少WebApi是这样,但我不知道它是否适用于MVC。
答案 3 :(得分:1)
以下是完整的实施:
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);
}
}
}
答案 4 :(得分:0)
对于WebApi,您应该从nuget安装Microsoft.AspNet.WebApi.Core。 对于MVC,您可以使用System.Web.MVC。
答案 5 :(得分:0)
我的问题要简单得多:
检查您的控制器是否装有<actionPreProcessActivitiesAttribute()> _