gpt4 book ai didi

c# - 为什么我的 DelegatingHandler 会触发 MVC 请求?

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:43 27 4
gpt4 key购买 nike

我有一个 MVC/Web API 混合项目,我添加了一个简单的 DelegatingHandler 实现来包装 API 响应。这很好用,但处理程序也被调用以请求 MVC Controller 。我的理解是 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 请求不会被包装。网页上的错误信息是:

No HTTP resource was found that matches the request URI 'xxx'. No route data was found for this request.

我尝试强制注册路由的顺序,以便在 Web API 之前添加 MVC 路由,但这没有帮助。

最佳答案

这很容易重现,我不确定这是否是一个错误。

  • 使用 ASP.NET MVC 模板创建新的网络应用
  • 安装 Microsoft.AspNet.WebApi.Owin 和Microsoft.Owin.Host.SystemWeb NuGet 包
  • 将 Web API 启动从 WebApiConfig.cs 移动到新的 Startup.cs 文件
  • 创建一个 DelegatingHandler 并将其添加到 Startup 类中的 config.MessageHandlers
  • 将为 MVC 和 API 请求调用 DelegatingHandler

我在 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;
}

}

关于c# - 为什么我的 DelegatingHandler 会触发 MVC 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36654088/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com