我正在尝试实现这里所看到的: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;
}
}
为什么此操作筛选器不会触发其中的任何事件?
发布于 2015-06-26 02:02:39
对于其他遇到这种情况的人,当从你的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。
发布于 2016-02-04 20:02:14
下面是完整的实现:
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);
}
}
}
发布于 2016-03-08 06:33:39
对于WebApi,您应该从nuget安装Microsoft.AspNet.WebApi.Core。对于MVC,你可以使用System.Web.MVC。
https://stackoverflow.com/questions/12992722
复制相似问题