- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我面临的问题是 AutoFac 没有将预期的参数注入(inject)相应的过滤器。
我有一个过滤器,用于记录我所有 Controller 中所有方法的执行持续时间。为了完成这项任务,我创建了一个像这样的 ActionFilter:
//... other usings here...
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
namespace MyNamespace
{
internal class ExecutionTimeFilter : ActionFilterAttribute
{
public Logger _logger { get; set; }
public ExecutionTimeFilter(Logger logger)
{
_logger = logger;
}
public override void OnActionExecuting(HttpActionContext actionContext)
{
_logger.Log("Log the starting time + controller + action + etc");
actionContext.Request.Properties["Stopwatch"] = Stopwatch.StartNew();
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
var stopwatch = (Stopwatch)actionExecutedContext.Request.Properties["Stopwatch"];
_logger.Log("Log the stopwatch.ElapsedMilliseconds + controller + action + etc");
}
}
}
我正在注册我的依赖项如下:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
var container = new IocConfiguration().Configure(GlobalConfiguration.Configuration);
var resolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = resolver;
//This is the only way I can get the logger injected
//This is what ideally I want to avoid
GlobalConfiguration.Configuration.Filters.Add(new ExecutionTimeFilter(_logger));
}
//IocConfiguration
using Autofac;
using Autofac.Integration.WebApi;
using System.Reflection;
using System.Web.Http;
using System.Web.Mvc;
namespace MyNamespace
{
internal class IocConfiguration
{
public IContainer Configure(HttpConfiguration httpConfiguration)
{
var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterInstance(LogManager.GetLogger("LoggerName")).As<Logger>().SingleInstance();
builder.RegisterWebApiFilterProvider(httpConfiguration);
return builder.Build();
}
}
}
如果我按照 official site 中描述的步骤进行操作我收到代码片段后描述的错误:
var builder = new ContainerBuilder();
builder.Register(c => new ExecutionTimeFilter(c.Resolve<Logger>()))
.AsWebApiActionFilterFor<MyController>()
.InstancePerRequest();
The type 'MyController' must be assignable to 'Autofac.Integration.WebApi.IAutofacActionFilter'. Parameter name: registration
这是 Controller 的摘录:
//...Other usings...
using System.Threading.Tasks;
using System.Web.Http;
using System;
namespace MyNamespace.Controllers
{
public class MyController : ApiController
{
private readonly Logger _logger;
public MarketoController(Logger logger)
{
_logger = logger;
}
}
[HttpGet]
[Route("path/{entityId}")]
[ValidateEntityId]
public async Task<IHttpActionResult> Get(int? entityId = null)
{
return Ok();
}
}
我错过了什么?
最佳答案
我看到你的过滤器,ExecutionTimeFilter
, 继承自 ActionFilterAttribute
. If you notice in the docs Autofac 过滤器机制不使用 Web API 操作过滤器接口(interface)。
异常消息有点令人困惑,但我猜问题是您正尝试在注册中使用 Web API 属性过滤器,而该注册期望您使用 Autofac 过滤器接口(interface)。
您可能在文档中错过的关键步骤是第二步,它说:
Instead of deriving from one of the existing Web API filter attributes your class implements the appropriate filter interface defined in the integration. The filter below is an action filter and implements
IAutofacActionFilter
instead ofSystem.Web.Http.Filters.IActionFilter
.
我在最重要的地方添加了一些粗体。
文档归结为:
Register(...).AsWebApiActionFilterFor<T>()
东西,你需要使用 Autofac 过滤器接口(interface)。文档中有关于 Autofac 使用自定义接口(interface)的确切原因以及 DI 不适用于标准过滤器的原因的详细解释。
关于c# - Autofac.WebApi2 全局操作过滤器注入(inject)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50634363/
我想为我的 ABP 项目中的特定应用程序服务关闭自动 WebAPI 生成服务。 最佳答案 RemoteService 属性可用于将类标记为远程服务或禁用固有地实现 IRemoteService 接口(
我无法从 postman 访问 webapi 错误是下一个: 如您所见,没有授权。 valuescontroller.cs 是: namespace CVService.Controllers {
我无法从 postman 访问 webapi 错误是下一个: 如您所见,没有授权。 valuescontroller.cs 是: namespace CVService.Controllers {
我有以下 Controller ,它应该接受用户名和密码作为 POST 中的有效负载。如果我将其更改为 HttpGet 就可以了。 [RoutePrefix("api")] public class
使用以下路线: routes.MapHttpRoute( name: "Set", routeTemplate: "api/set/{id}",
我正在使用 AngularJS,我正在尝试将 json 从我的服务发送到 webAPI Controller 。当我通过发送时,我在 webApi 函数的参数中收到 null。 我的功能服务是: an
据我了解,如果我有一个 ASP.NET WebApi 方法,其签名如下所示...... public HttpResponseMessage PostCustomer(Customer custome
我遇到了一个解决方案问题,我使用 Visual Studio SPA 模板中的部分在具有 Oauth 身份验证的 WebApi 中拥有帐户 Controller 。 app.UseOAuthBea
我按照此处的说明将 webApi.HelpPage 区域和 View 添加到使用 structureMap 的现有项目中 - 但是在访问/Help url 时: StructureMap Except
我有一个 WebAPI。如何返回并打开网页。例如,我想打开 CNN.com 页面。 [HttpGet] public HttpResponseMessage Get()
我想知道是否有人可以澄清这一点。我发现用法令人困惑。 链接和视频都没有回答我的问题 我知道像这样的链接 asp.net core middleware vs filters 甚至还有关于它的视频 但是
运行以下最新版本(在撰写本文时): Visual Studio 2019 16.4.5 .NET 核心 SDK 3.1.102 x64 测试的浏览器: 谷歌浏览器 80.0.3987.122 火狐 7
想法是,将有一个外部实体 (SharePoint) 调用我的 WebAPI 并传入 PDF 文件以及有关该 PDF 文件的一些额外元数据信息。我被困在如何构造 Web API 方法的签名上。这是我到目
我有一个 WebApi 服务处理来自简单表单的上传,如下所示: 但是,我不知道如何使用 HttpClient API 模拟同一
嗨,我是 Angular 的新手,现在我从一个示例登录页面开始,该页面传递包含用户名和密码的 userEntity。userEntity 是一个对象/实体是 webapi。 问题:当我为登录按钮单击
我有一个 AngularJS + MVC + WebAPI,我正在尝试:- 使用标准(个人账户)进行MVC认证;- 使用相同的用户和密码进行基于 WebAPI 的身份验证。 问题,AngularJS
Web API 的版本存在一些混淆。看看这个 Web API at NuGet , Microsoft ASP.NET Web API 2.2 5.2.3 什么?这里是没有提到 2.2 的描述 我的猜
我正在开发一个 Web 应用程序,该应用程序将 Owin 托管用于 MVC 和 WebApi 2。 我最近将 Microsoft Mvc/WebApi 包从 5.2.2 版升级到 5.2.3 版,将
随着Web技术的发展,现在各种框架,前端的,后端的,数不胜数。全栈工程师的压力越来越大。 现在的前端的框架,既可以做各种Web,又可以做各种APP,前端框架更新换代越来越快,越来越多。 传统的模
1. WebAPI 背景知识 1.1 什么是 WebAPI JS 分成三个大的部分: ECMAScript: 基础语法部分 DOM API: 操作页面结构 BOM API: 操作浏览器 WebAPI
我是一名优秀的程序员,十分优秀!