75

ここに表示されているものを実装しようとしています: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;
    }
}

このアクションフィルターが内部のイベントを発生させないのはなぜですか?

4

6 に答える 6

178

MVC アセンブリと WebAPI アセンブリの両方を含むプロジェクトで作業している場合、ActionFilterAttribute の名前空間が何であるかを確認できますか。両方の下に 2 つの ActionFilterAttributes があるため、かなり混乱します。

  • WebAPI: System.Web.Http.Filters
  • MVC: System.Web.Http.Mvc
于 2012-10-21T06:12:07.080 に答える
38

上記の答えは間違いなく私を助けました-他の時間を節約するために...ここに明確な違いがあります。

標準 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);
}
于 2013-03-26T03:35:55.020 に答える
7

これに遭遇した他の人にとっては、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 に当てはまるかどうかはわかりません。

于 2015-06-25T18:02:39.203 に答える
0

WebApi の場合、nuget から Microsoft.AspNet.WebApi.Core をインストールする必要があります。MVC の場合、System.Web.MVC を使用できます。

于 2016-03-07T22:33:38.840 に答える