2

所以,我正在尝试使用 MVC 4 构建我的第一个 Web api。一切顺利。我设法在我的网站上使用基本身份验证(使用 SSL),但我有一个问题,有点。

我在每个 ApiController 上都有一小段代码:

    private Profile user
    {
        get
        {                
            var UserId = Membership.GetUser(User.Identity.Name).ProviderUserKey.ToString();
            var Profile = new Profile(UserId);
            return Profile;
        }
    }

我这样做是因为我的自定义配置文件中有一些额外的字段;即公司ID。我的所有功能都需要这个 CompanyId 来获取数据。我正在考虑使用 CompanyId 作为令牌,但我无法让它工作:D

所以我的问题是:有没有办法为每个请求全局存储 CompanyId?也许在路由消息处理程序的过滤器中。我知道我不能使用会话等,因为 API 是无状态的,但另一方面我不想一直重复代码......

4

2 回答 2

1

除了@Alon 提到的选项之外,我强烈建议您查看Dependency Injection(DI)DI 容器,例如Autofac. 使用 DI,您可以将这种情况下的依赖项推Profile送到 API 控制器中,或者事实上推送到任何需要 Profile 的类中。

由于构造函数注入是首选机制,因此类签名如何变成

public class Class1 {
    public Profile CurrentUserProfile { get;private set;}

    public Class1(Profile profile){
       this.CurrentUserProfile=profile;   // Now you can use it throughout the class.
    }
}

您可以将此类依赖项注入到基类中,例如 BaseApiController。

然后 Autofac 注册看起来像

builder.Register<Gateway.IRequestContextBuilder>((c) =>
{
            var UserId = Membership.GetUser(User.Identity.Name).ProviderUserKey.ToString();
            var Profile = new Profile(UserId);
            return Profile;

}).InstancePerHttpRequest();

这将为每个 HTTP 请求创建一次 Profile 对象,然后可以将其注入任何依赖类。

这可能会让您感到困惑,但是一旦您了解了 DI 概念和 Autofac 等容器,这将开始变得更有意义。

于 2013-03-09T13:47:52.200 回答
1

你有两个选择:

  1. (更简单的一种)使用页面处理事件之一(在 Global.asax 中)获取配置文件信息并将其存储在 HttpContext
  2. 创建你自己的 HttpModule,它会做同样的事情(获取配置文件并将其存储在 HttpContext 中)

您可以从 API 方法访问 HttpContext。我会选择第一个选项,因为它更简单。

于 2013-03-09T11:29:18.307 回答