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 发送到控制器。
我有一个 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 发送到控制器。