我有一个混合的MVC / Web API项目,我添加了一个简单的DelegatingHandler实现来包装API响应。这很好用,但是对于MVC控制器的请求也会调用处理程序。我的理解是只调用DelegatingHandlers用于API路由。
我使用OWIN和一些属性路线,如果重要的话。 Startup.cs中的相关代码是:
var config = new HttpConfiguration();
// ...
var debugging = HttpContext.Current == null || HttpContext.Current.IsDebuggingEnabled;
config.MessageHandlers.Add(new ApiResponseDelegatingHandler(debugging));
这会导致API和Web请求被包装并作为JSON发送。评论它可以解决问题,但API请求不会被包装。网页上的错误消息是:
未找到与请求URI匹配的HTTP资源' xxx'。没有 找到了此请求的路由数据。
我尝试强制注册路由的顺序,以便在Web API之前添加MVC路由但没有帮助。
答案 0 :(得分:1)
这很容易重现,我不确定它是否是一个错误。
我在Startup.cs和WebApiConfig.cs中尝试了几种初始化的组合但没有成功。如果您;不使用属性路由,解决方案是将处理程序添加到路由。如果你是,我找到的唯一解决方法是检查处理程序中的路由,如果路由以" / api /"开头,则只包装API响应。
public class WtfDelegatingHandler : DelegatingHandler
{
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var response = await base.SendAsync(request, cancellationToken);
if (request.RequestUri.LocalPath.StartsWith("/api/", StringComparison.OrdinalIgnoreCase))
{
response = new HttpResponseMessage()
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent("I'm an API response")
};
}
return response;
}
}