我有一个自定义授权属性,如下所示:
public class AuthorizeApplicationAttribute : AuthorizeAttribute {
private MainServiceSoapClient client;
public AuthorizeApplicationAttribute() {
this.client = new MainServiceSoapClient();
}
public AuthorizeApplicationAttribute(MainServiceSoapClient client) {
this.client = client;
}
protected override bool IsAuthorized(HttpActionContext actionContext) {
if (!base.IsAuthorized(actionContext)) return false;
var currentUser = System.Web.Security.Membership.GetUser();
if (currentUser == null) return false;
var userId = (int)currentUser.ProviderUserKey;
return client.HasPermission(userId);
}
}
我在WebApiConfig
注册为:
public class WebApiConfig {
public static void Register(HttpConfiguration config) {
// Web API configuration and services
config.Filters.Add(new AuthorizeApplicationAttribute());
// more configuration ...
}
}
但是AuthorizeAttribute
没有处置,我可以使用soap客户端实例调用构造函数,但是我不知道在哪里处置它。
仅供参考:我没有使用IoC容器。试图学习如何手动制作它。
此示例使用SoapClient
,但我对DbContext
有同样的问题,而我可以在不处置DbContext
的情况下生活,并且不会认为不会处置WCF客户端那很好。
答案 0 :(得分:1)
在IsAuthorized方法中使用using语句在需要时初始化和Dispose,而不是在构造函数中初始化。
如果您需要依赖注入,那么您可以使用Property Injection。
这个问题有Ninject和StructureMap How to use dependency injection with an attribute?
的两个答案答案 1 :(得分:1)
此问题的解决方案可能会为您提供您想要的内容:
What is the best workaround for the WCF client `using` block issue?