asp.net - Application_EndRequest 的 OWIN 等价物是什么?

标签 asp.net owin

我正在将一个 ASP.NET Web API 应用程序迁移到 OWIN。这并不是要使用 none OWIN 部署。所以 Global.asax 将被删除。 Global.asax 事件处理程序中有一些代码专门放在 Application_EndRequest 中,应该由 OWIN 处理。

我已经阅读了一些关于 OWIN 的文章并在互联网上进行了搜索,但无法确定如何完成。谁能描述一下如何做到这一点?

我的环境:

  • Visual Studio 2015 RC
  • .Net Framework 4.5
  • Microsoft.AspNet.Cors.5.0.0
  • Microsoft.AspNet.WebApi.5.2.3
  • 微软.Owin.3.0.1
  • Owin.1.0

更新:这是当前代码的一些部分

using System;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using ProjectX.Web.AppStart;
using ProjectY.Domain.Contracts;

namespace ProjectX.UI
{
    public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_EndRequest(object sender, EventArgs e)
        {
            var unitOfWork = DependencyResolver.Current.GetService(typeof(IUnitOfWork)) as IUnitOfWork;

            unitOfWork.SaveChanges();
        }
    }
}


namespace ProjectY.Domain.Contracts
{
    public interface IUnitOfWork
    {
        void SaveChanges();
        IRepository<T> GetRepository<T>() where T : class, IEntity, IHistory;
        IDbContext GetDbContext();
    }
}




using ProjectY.Core.Repositories;
using ProjectY.Domain.Contracts;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ProjectY.Core.UnitOfWork
{
    public class UnitOfWork : IUnitOfWork
    {
        public UnitOfWork(IProjectYDbContextFactory contextFactory)
        {
            _context = contextFactory.GetContext();
        }

        public void SaveChanges()
        {
            if (_context == null)
                throw new ApplicationException("Something wrong has been happened. _context must not be null.");

            _context.SaveChanges();
        }
    }
}

最佳答案

我在更新一些遗留应用程序时偶然发现了这个问题。对于那些仍在寻找答案的人:您可以通过创建一个中间件来解决这个问题:

app.Use(async (context, next) =>
{
    await next.Invoke().ConfigureAwait(false);
    //Do stuff after request here!
    var unitOfWork = DependencyResolver.Current.GetService(typeof(IUnitOfWork)) as IUnitOfWork;
    unitOfWork.SaveChanges();
});

如果您需要更多地控制在请求处理管道中调用中间件的时间,您可以使用阶段标记。

另见 https://learn.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline#stage-markers

关于asp.net - Application_EndRequest 的 OWIN 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31265073/

相关文章:

c# - OWIN - 没有特定端口的自托管 Web Api

asp.net-web-api - Ninject.Web.WebApi.OwinHost v3.2.x 的 Ninject 依赖项

asp.net - ASP .NET MVC 3. session 过期太快

c# - 如何从给定日期获取一年中的总天数

asp.net - 清除匿名身份?

c# - 如何使用明文密码作为oauth登录?

c# - 如何确保在 OWIN 应用程序中进行 WS 联合身份验证后使用用户的原始请求 URL

asp.net - 有 www 和无 www 的表单例份验证

asp.net - 多服务器设置上的“进程内” session 状态模式?

c# - 同步 OWIN Cookie 过期(滑动)和 session 超时