【发布时间】:2015-07-01 16:12:14
【问题描述】:
我一直在尝试将一些 OWIN 中间件插入现有的 WebApi 项目。我的初创公司最初只包含以下几行:
application.UseOAuthBearerAuthentication(newOAuthBearerAuthenticationOptions());
application.UseWebApi(config);
使用此配置,我间歇性地(主要是在 iisreset 之后)收到格式错误的响应(由 fiddler 识别),这是由中间件尝试添加标头引起的,但在发送响应后,这被报告为例外:
Server cannot append header after HTTP headers have been sent.
我重新编译了 Microsoft.Owin.Security.OAuth 以添加一些额外的跟踪来显示事情发生的顺序,我得到了以下输出:
Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationMiddleware Information: 0 : : OAUTH: Authenticating...
System.Web.Http.Request: ;;http://localhost:555/entityinstance/member
System.Web.Http.Controllers: WebHostHttpControllerTypeResolver;GetControllerTypes;:
System.Web.Http.Controllers: WebHostHttpControllerTypeResolver;GetControllerTypes;:
System.Web.Http.MessageHandlers: LogHandler;SendAsync;:
System.Web.Http.Controllers: DefaultHttpControllerSelector;SelectController;Route='entityDefinitionName:member,controller:EntityInstance'
System.Web.Http.Controllers: DefaultHttpControllerSelector;SelectController;EntityInstance
System.Web.Http.Controllers: HttpControllerDescriptor;CreateController;:
System.Web.Http.Controllers: WindsorCompositionRoot;Create;:
System.Web.Http.Controllers: WindsorCompositionRoot;Create;Loyalty.Services.WebApi.Controllers.EntityInstanceController
System.Web.Http.Controllers: HttpControllerDescriptor;CreateController;Loyalty.Services.WebApi.Controllers.EntityInstanceController
System.Web.Http.Controllers: EntityInstanceController;ExecuteAsync;:
System.Web.Http.Action: ApiControllerActionSelector;SelectAction;:
System.Web.Http.Action: ApiControllerActionSelector;SelectAction;Selected action 'Get(String entityDefinitionName)'
System.Net.Http.Formatting: DefaultContentNegotiator;Negotiate;Type='HttpError', formatters=[JsonMediaTypeFormatterTracer, XmlMediaTypeFormatterTracer, FormUrlEncodedMediaTypeFormatterTracer, FormUrlEncodedMediaTypeFormatterTracer]
System.Net.Http.Formatting: JsonMediaTypeFormatter;GetPerRequestFormatterInstance;Obtaining formatter of type 'JsonMediaTypeFormatter' for type='HttpError', mediaType='application/json; charset=utf-8'
System.Net.Http.Formatting: JsonMediaTypeFormatter;GetPerRequestFormatterInstance;Will use same 'JsonMediaTypeFormatter' formatter
System.Net.Http.Formatting: DefaultContentNegotiator;Negotiate;Selected formatter='JsonMediaTypeFormatter', content-type='application/json; charset=utf-8'
System.Web.Http.Controllers: EntityInstanceController;ExecuteAsync;:
System.Net.Http.Formatting: JsonMediaTypeFormatter;WriteToStreamAsync;Value='System.Web.Http.HttpError', type='HttpError', content-type='application/json; charset=utf-8'
System.Net.Http.Formatting: JsonMediaTypeFormatter;WriteToStreamAsync;:
System.Web.Http.Request: ;;Content-type='application/json; charset=utf-8', content-length=68
System.Web.Http.Controllers: EntityInstanceController;Dispose;:
System.Web.Http.Controllers: EntityInstanceController;Dispose;:
Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationMiddleware Information: 0 : : OAUTH: Applying Challange...
A first chance exception of type 'System.Web.HttpException' occurred in System.Web.dll
所以看起来是中间件的响应处理部分,遵循俄罗斯娃娃模型正在尝试修改标头,但响应已经在前一阶段完成。我尝试添加不同的阶段标记来控制这种行为,但似乎没有任何帮助。
看到那条痕迹后令人惊讶的是,它并非一直都在发生。我用一个更简单的实现编写了我自己的这个中间件版本,在注册这个之后,代替 MS,我确实开始看到每个请求的错误,我想知道它是否总是被抛出,但被吞了有时,或者提琴手是否没有等待足够长的时间才能看到它。
我目前最好的猜测是这个问题的发生是由于对 Owin 使用不同的 HttpConfiguration 而不是 WebApi 设置。不幸的是,我无法换出整个 HTTPApplication 并转到 OWIN 锁库,因为委派处理程序在 OWIN 的不同上下文中运行,您无法访问路由数据,因为这会破坏很多我们现有的基础设施。
任何人都可以给我任何关于这里发生的事情的指示,这是一个受支持的场景吗?我错过了什么明显的东西吗?
【问题讨论】:
-
我也有这个问题
-
可以stackoverflow.com/questions/25483508/…解决您的问题吗?
标签: asp.net-web-api oauth owin katana