WebAPI 2方法表示404用于一种方法,而不是另一种方法



我有一个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转换成broswer。正如我所期望的,它返回一个真或假。发生故障的控制器非常相似。

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

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之间的区别。感谢您的帮助。

Windows 10,VS Pro 2017 15.8.8,IIS Express

这似乎更像是一个。(点(问题。当您有一个点时,在通过URI传递的params中,WebAPI需要在变量末尾有一个"/"字符。为了让它工作,你应该用这种方式打电话

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

这就是为什么你第一次打电话给

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

正在工作。

尝试添加。(点(到PRD,即使是SubscriptionCheck也无法工作。无论如何,在这种情况下,当您有可能具有某些特殊字符的params时,我建议您使用POST谓词并向控制器发送JSON。

我发现了一个不太好的解决方案,因为我不太了解它。RAMMFAR。如果我将runAllManagedModulesForAllRequests属性添加到模块元素中,设置为true,它将按预期工作。我发现这一点是因为我在完成电子邮件地址参数之前不小心击中了返回键。API的行为正如我对一个糟糕的电子邮件地址的预期。这让我在MVC应用程序中搜索"@"字符,RAMMFAR就是一个答案。有一个模块会查看带有"@"的URL并从管道中窃取它。我想。如果我想承受RAMMFAR的副作用,我的API现在有效。我仍然想知道细节。

相关内容

最新更新