WebAPI 2 方法对一个方法说 404 而不是另一个方法

WebAPI 2 method says 404 for one but not another method

我有一个 WebApi 2.0 项目。我有两个控制器。一个按预期工作,另一个给我一个 404。工作控制器:

    namespace SubscriptionApi.Controllers
    {
        using System.Threading.Tasks;
        using System.Web.Http;
        using Models.Services;

        [RoutePrefix("api/SubscriptionCheck")]
        public class SubscriptionCheckController : ApiController
        {
            public SubscriptionCheckController(IQuerySubscription queryService)
            {
                QueryService = queryService;
            }

            private IQuerySubscription QueryService { get; }

            [HttpGet] 
            [Route("Get/{email}/{productCode}")]
            public async Task<bool> Get(string email, string productCode)
            {
                return await QueryService.IsSubscribed(email, productCode);
            }
        }
    }

在我的浏览器中,我可以 运行 应用程序并在浏览器中输入 http://localhost:55816/api/SubscriptionCheck/Get/bob@place.org/PRD。正如我所料,它 returns 是真还是假。失败的控制器非常相似。

    namespace SubscriptionApi.Controllers
    {
        [RoutePrefix("api/RepresentativeCheck")]
        public class RepresentativeCheckController : ApiController
        {
            public RepresentativeCheckController(IQuerySubscription queryService)
            {
                QueryService = queryService;
            }

            private IQuerySubscription QueryService { get; }

            [HttpGet]
            [Route("Get/{email}")]
            public async Task<bool> Get(string email)
            {
                return await QueryService.IsPrimaryOrAlternateRepresentative(email);
            }
        }
}

使用应用 运行ning 我输入 http://localhost:55816/api/RepresentativeCheck/Get/bob@place.org 并报告“HTTP 错误 404.0 - 未找到 您要查找的资源已被删除、更名或暂时不可用。"

global.asax没什么奇怪的:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

WebApi 在 MVC 页面之前配置。使用属性路由,我不希望路由表有任何影响,但为了完整性:

    public static void Register(HttpConfiguration config)
    {
        config.RegisterResolver();
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new {id = RouteParameter.Optional}
        );
    }

我看不出工作正常的 SubscriptionCheck 和告诉我 404 的 RepresentativeCheck 之间的区别。感谢任何帮助。

Windows10、VS Pro 2017 15.8.8、IIS Express

我发现了一个不是完全解决方案的解决方法,因为我不太理解它。拉姆法尔。如果我将 runAllManagedModulesForAllRequests 属性添加到我的模块元素,设置为 true,它会按预期工作。我发现这一点是因为我在完成电子邮件地址参数之前不小心按下了 return 键。 API 的行为与我预期的错误电子邮件地址一样。这导致我 google 关于 MVC 应用程序中的“@”字符,而 RAMMFAR 是一个答案。有一些模块查看带有“@”的 URL 并从管道中窃取它。我猜。如果我想忍受 RAMMFAR 的副作用,我的 API 现在可以使用了。我还是想知道详情。

好像多了一个。 (点)问题。当你有一个点时,在通过 URI 传递的参数中,WebAPI 期望变量末尾有一个“/”字符。 要使其正常工作,您应该以这种方式进行调用

http://localhost:55816/api/RepresentativeCheck/Get/bob@place.org/

这就是你第一次打电话的原因

http://localhost:55816/api/SubscriptionCheck/Get/bob@place.org/PRD

正在工作。

尝试添加一个 . (点)到 PRD,即使 SubscriptionCheck 也不起作用。 无论如何,在这种情况下,当您的参数可能具有某些特殊字符时,我建议您使用 POST 动词并将 JSON 发送到控制器。