在调用操作之前处理导出的网络 API 控制器
Exported web API controller disposed before calling action
我有一个 Web 项目,它是 ASp.net MVC,我的控制器是用于路由的 mvc 控制器,api controllers.I 使用托管扩展框架 (MEF)。
我刚刚启动了具有 mvc account controller 和 ap account contoller 的登录页面。登录页面 运行,当我提交用户名和密码时,它从 angular 控制器调用 api 控制器,然后它进入 api 控制器的构造函数,然后调用在调用我的登录操作之前处理然后找不到资源的错误页面请求 URL:/account/login
我使用 WebSecurity 的登录操作 Class (WebMatrix.WebData)
这是我的基地Api控制器
public class ApiControllerBase : ApiController, IServiceAwareController
{
List<IServiceContract> _DisposableServices;
protected virtual void RegisterServices(List<IServiceContract> disposableServices)
{
}
void IServiceAwareController.RegisterDisposableServices(List<IServiceContract> disposableServices)
{
RegisterServices(disposableServices);
}
List<IServiceContract> IServiceAwareController.DisposableServices
{
get
{
if (_DisposableServices == null)
_DisposableServices = new List<IServiceContract>();
return _DisposableServices;
}
}
protected void ValidateAuthorizedUser(string userRequested)
{
string userLoggedIn = User.Identity.Name;
if (userLoggedIn != userRequested)
throw new SecurityException("Attempting to access data for another user.");
}
protected HttpResponseMessage GetHttpResponse(HttpRequestMessage request, Func<HttpResponseMessage> codeToExecute)
{
HttpResponseMessage response = null;
try
{
response = codeToExecute.Invoke();
}
catch (SecurityException ex)
{
response = request.CreateResponse(HttpStatusCode.Unauthorized, ex.Message);
}
catch (FaultException<AuthorizationValidationException> ex)
{
response = request.CreateResponse(HttpStatusCode.Unauthorized, ex.Message);
}
catch (FaultException ex)
{
response = request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message);
}
catch (Exception ex)
{
response = request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message);
}
return response;
}
}
这是我的帐户 Api 控制器
[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
[RoutePrefix("api/account")]
public class AccountApiController : ApiControllerBase
{
[ImportingConstructor]
public AccountApiController(ISecurityAdapter securityAdapter)
{
_SecurityAdapter = securityAdapter;
}
ISecurityAdapter _SecurityAdapter;
[HttpPost]
[Route("login")]
public HttpResponseMessage Login(HttpRequestMessage request, [FromBody]AccountLoginModel accountModel)
{
return GetHttpResponse(request, () =>
{
HttpResponseMessage response = null;
bool success = _SecurityAdapter.Login(accountModel.LoginEmail, accountModel.Password, accountModel.RememberMe);
if (success)
response = request.CreateResponse(HttpStatusCode.OK);
else
response = request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Unauthorized login.");
return response;
});
}
}
我注册了我的 mef 扩展 class,它在 globa asax 中处理 MEF
AggregateCatalog catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
CompositionContainer container = MEFLoader.Init(catalog.Catalogs);
DependencyResolver.SetResolver(new MefDependencyResolver(container)); // view controllers
GlobalConfiguration.Configuration.DependencyResolver = new MefAPIDependencyResolver(container); // web api controllers
这也是我的 mef 依赖解析器 class
public class MefAPIDependencyResolver : IDependencyResolver
{
public MefAPIDependencyResolver(CompositionContainer container)
{
_Container = container;
}
CompositionContainer _Container;
public IDependencyScope BeginScope()
{
return this;
}
public object GetService(Type serviceType)
{
return _Container.GetExportedValueByType(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return _Container.GetExportedValuesByType(serviceType);
}
public void Dispose()
{
}
}
我失去了情节。在此先感谢您的帮助。
糟糕,这是我的错。
它是关于 html 表单的,它对 mvc 控制器有一个操作,但它不存在
所以而不是
<form class="loginForm" action="@Url.Action("Login","Account")" method="post" name="loginForm">
所以我将其替换为
<form class="loginForm" name="loginForm"> <!--Without action-->
<!--and submit button-->
<button type="submit" class="btn blue pull-right" ng-click="login()">
我有一个 Web 项目,它是 ASp.net MVC,我的控制器是用于路由的 mvc 控制器,api controllers.I 使用托管扩展框架 (MEF)。 我刚刚启动了具有 mvc account controller 和 ap account contoller 的登录页面。登录页面 运行,当我提交用户名和密码时,它从 angular 控制器调用 api 控制器,然后它进入 api 控制器的构造函数,然后调用在调用我的登录操作之前处理然后找不到资源的错误页面请求 URL:/account/login 我使用 WebSecurity 的登录操作 Class (WebMatrix.WebData)
这是我的基地Api控制器
public class ApiControllerBase : ApiController, IServiceAwareController
{
List<IServiceContract> _DisposableServices;
protected virtual void RegisterServices(List<IServiceContract> disposableServices)
{
}
void IServiceAwareController.RegisterDisposableServices(List<IServiceContract> disposableServices)
{
RegisterServices(disposableServices);
}
List<IServiceContract> IServiceAwareController.DisposableServices
{
get
{
if (_DisposableServices == null)
_DisposableServices = new List<IServiceContract>();
return _DisposableServices;
}
}
protected void ValidateAuthorizedUser(string userRequested)
{
string userLoggedIn = User.Identity.Name;
if (userLoggedIn != userRequested)
throw new SecurityException("Attempting to access data for another user.");
}
protected HttpResponseMessage GetHttpResponse(HttpRequestMessage request, Func<HttpResponseMessage> codeToExecute)
{
HttpResponseMessage response = null;
try
{
response = codeToExecute.Invoke();
}
catch (SecurityException ex)
{
response = request.CreateResponse(HttpStatusCode.Unauthorized, ex.Message);
}
catch (FaultException<AuthorizationValidationException> ex)
{
response = request.CreateResponse(HttpStatusCode.Unauthorized, ex.Message);
}
catch (FaultException ex)
{
response = request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message);
}
catch (Exception ex)
{
response = request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message);
}
return response;
}
}
这是我的帐户 Api 控制器
[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
[RoutePrefix("api/account")]
public class AccountApiController : ApiControllerBase
{
[ImportingConstructor]
public AccountApiController(ISecurityAdapter securityAdapter)
{
_SecurityAdapter = securityAdapter;
}
ISecurityAdapter _SecurityAdapter;
[HttpPost]
[Route("login")]
public HttpResponseMessage Login(HttpRequestMessage request, [FromBody]AccountLoginModel accountModel)
{
return GetHttpResponse(request, () =>
{
HttpResponseMessage response = null;
bool success = _SecurityAdapter.Login(accountModel.LoginEmail, accountModel.Password, accountModel.RememberMe);
if (success)
response = request.CreateResponse(HttpStatusCode.OK);
else
response = request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Unauthorized login.");
return response;
});
}
}
我注册了我的 mef 扩展 class,它在 globa asax 中处理 MEF
AggregateCatalog catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
CompositionContainer container = MEFLoader.Init(catalog.Catalogs);
DependencyResolver.SetResolver(new MefDependencyResolver(container)); // view controllers
GlobalConfiguration.Configuration.DependencyResolver = new MefAPIDependencyResolver(container); // web api controllers
这也是我的 mef 依赖解析器 class
public class MefAPIDependencyResolver : IDependencyResolver
{
public MefAPIDependencyResolver(CompositionContainer container)
{
_Container = container;
}
CompositionContainer _Container;
public IDependencyScope BeginScope()
{
return this;
}
public object GetService(Type serviceType)
{
return _Container.GetExportedValueByType(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return _Container.GetExportedValuesByType(serviceType);
}
public void Dispose()
{
}
}
我失去了情节。在此先感谢您的帮助。
糟糕,这是我的错。 它是关于 html 表单的,它对 mvc 控制器有一个操作,但它不存在 所以而不是
<form class="loginForm" action="@Url.Action("Login","Account")" method="post" name="loginForm">
所以我将其替换为
<form class="loginForm" name="loginForm"> <!--Without action-->
<!--and submit button-->
<button type="submit" class="btn blue pull-right" ng-click="login()">