ASP.NET Web API字符串反转接口404错误排查求助
问题排查与修复方案
核心问题分析
从错误日志和代码来看,导致404的原因有两个:
- 命名空间不匹配:控制器所在的
ReverseStringAPI.Controllers命名空间与项目根命名空间WebApplication2不一致,Web API默认只会扫描根命名空间下的控制器,导致无法识别你的ReverseStringController。 - 路由注册顺序错误:Global.asax中先注册了MVC路由,后注册Web API路由。当请求
/api/ReverseString进来时,MVC路由会先尝试匹配,而你的控制器继承的是ApiController(Web API控制器),不是MVC的Controller,所以MVC找不到对应的控制器,返回404。
具体修复步骤
1. 修正控制器命名空间
将ReverseStringController.cs的命名空间改为与项目一致的WebApplication2.Controllers:
using System; using System.Web.Http; namespace WebApplication2.Controllers { [RoutePrefix("api/[controller]")] public class ReverseStringController : ApiController { [HttpPost] public IHttpActionResult ReverseString([FromBody] string input) { if (string.IsNullOrEmpty(input)) { return BadRequest("Input string is required."); } char[] charArray = input.ToCharArray(); Array.Reverse(charArray); string reversedString = new string(charArray); return Ok(reversedString); } } }
2. 调整路由注册顺序
在Global.asax.cs中,将Web API路由注册移到MVC路由之前,确保Web API先处理匹配的请求:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Http; using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; namespace WebApplication2 { public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); // 优先注册Web API路由 GlobalConfiguration.Configure(WebApiConfig.Register); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } } }
3. Postman测试注意事项
- 请求方法选择POST
- URL填写项目运行后的地址,例如
http://localhost:5000/api/ReverseString(替换成你的实际端口) - 请求体选择
raw->JSON,内容格式为带双引号的字符串,例如:"HelloWorld"
可选方案(不修改命名空间时使用)
如果需要保留控制器的原有命名空间,可以在WebApiConfig.cs中添加程序集扫描配置,让Web API能找到其他命名空间下的控制器:
using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; using System.Web.Http.Dispatcher; namespace WebApplication2 { public static class WebApiConfig { public static void Register(HttpConfiguration config) { // 替换默认程序集解析器,添加自定义扫描逻辑 config.Services.Replace(typeof(IAssembliesResolver), new CustomAssembliesResolver()); config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } } public class CustomAssembliesResolver : DefaultAssembliesResolver { public override ICollection<System.Reflection.Assembly> GetAssemblies() { var assemblies = base.GetAssemblies(); // 加载控制器所在的程序集(如果是同一项目,可直接获取当前程序集) var controllerAssembly = System.Reflection.Assembly.GetExecutingAssembly(); assemblies.Add(controllerAssembly); return assemblies; } } }
内容的提问来源于stack exchange,提问作者FluffyFox332
相关产品推荐
相关产品推荐

