내 ASP.NET Web API ActionFilterAttribute OnActionExecuting이 실행되지 않는 이유는 무엇입니까?
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;
}
}
이 작업 필터가 내부 이벤트를 실행하지 않는 이유는 무엇입니까?
프로젝트에서 작업하는 경우 MVC 및 WebAPI 어셈블리가 모두 포함 된 경우 ActionFilterAttribute의 네임 스페이스가 무엇인지 확인할 수 있습니다. 둘 다 아래에 두 개의 ActionFilterAttributes가 있기 때문에 상당히 혼란 스럽습니다.
- WebAPI : System.Web.Http.Filters
- MVC : System.Web.Http.Mvc
위의 대답은 확실히 도움이되었습니다. 다른 사람들의 시간을 절약하기 위해 ... 여기에 분명한 차이점이 있습니다.
표준 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);
}
이 문제를 겪는 다른 사람에게는 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가 호출됩니다.
This is true for at least WebApi, but I don't know if it applies to MVC.
Here is the complete Implementation:
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);
}
}
}
For WebApi, you should install Microsoft.AspNet.WebApi.Core from nuget. For MVC you can use System.Web.MVC.
My problem was much more simple:
Check your Controller is decorated with <actionPreProcessActivitiesAttribute()> _
'program story' 카테고리의 다른 글
| Elasticsearch 2.0에서 원격 액세스 / 요청을 활성화하려면 어떻게해야합니까? (0) | 2020.10.31 |
|---|---|
| 쉘 스크립트에서 기간을 초 단위로 측정하려면 어떻게합니까? (0) | 2020.10.31 |
| 물리 디스크를 나열하는 방법은 무엇입니까? (0) | 2020.10.31 |
| 이 캐스트가 중복되는 이유는 무엇입니까? (0) | 2020.10.30 |
| Android에 대한 READ_EXTERNAL_STORAGE 권한 (0) | 2020.10.30 |