WebAPI 2方法对一个方法说404,但对另一方法不说

时间:2018-10-31 17:07:52

标签: asp.net-web-api2

我有一个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。如我所料,它会返回true或false。发生故障的控制器非常相似。

    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);
            }
        }
}

运行该应用程序后,我输入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);
    }

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

    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之间的区别。

Windows 10,VS Pro 2017 15.8.8,IIS Express

2 个答案:

答案 0 :(得分:1)

似乎更多。 (点)问题。当您有一个点时,在通过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发送到控制器。

答案 1 :(得分:0)

我发现一种解决方法不是完全解决方案,因为我不太了解。 RAMMFAR。如果我将runAllManagedModulesForAllRequests属性添加到我的modules元素,则设置为true,它将按预期工作。我发现此问题是因为我在完成电子邮件地址参数之前不小心按了回车键。 API的行为与我期望的错误电子邮件地址相同。这使我在MVC应用程序中用Google搜索有关“ @”字符,而RAMMFAR就是答案。有一些模块使用“ @”查看URL,并从管道中窃取该模块。我猜。如果我想忍受RAMMFAR的副作用,现在可以使用我的API。我仍然想知道细节。