为什么这个Web Api路由没有被匹配到?

22 浏览
0 Comments

为什么这个Web Api路由没有被匹配到?

所以在我的WebApi配置中,我添加了一个新的路由:

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

我也有控制器:

public class SwitchUserController : BaseApiController
{
    public HttpResponseMessage Put(int id) {
        return Request.CreateResponse(HttpStatusCode.OK);
    }   
}

然而在Chrome中:

请求URL:http://localhost:1352/cp/SwitchUser/123
请求方法:PUT
状态码:404 Not Found

我一直使用默认的Web API路由。我错过了什么吗?

0
0 Comments

为什么这个Web Api路由没有被捕获?

出现这个问题的原因很可能是您没有正确配置应用程序的httpHandlers。尝试将以下内容添加到web.config中:

<system.webServer>
  <validation validateIntegratedModeConfiguration="false" />
  <handlers>
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,PUT,DELETE" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,PUT,DELETE" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
</system.webServer>

请注意verb属性,它应该包含PUT动词。

0
0 Comments

为什么这个Web Api路由没有起作用?

我最终弄明白了发生了什么。原始的WebApi连接没有实际调用WebApiConfig.Register(GlobalConfiguration.Configuration);,所以当然我添加的所有配置都不影响Web Api。添加这个修复了问题。

好答案!当你将Web Api控制器添加到mvc项目中时就会发生这种情况。它创建了WebApiConfig文件,但没有在global.asax中注册它。

这个答案也很重要,确保Web Api路由在前面,否则它不起作用!stackoverflow.com/questions/22401403/…

问题的原因:原始的WebApi连接没有实际调用WebApiConfig.Register方法,因此无法影响Web Api的配置。

解决方法:在全局配置文件global.asax中调用WebApiConfig.Register方法。

另外,还要确保Web Api路由在其他路由之前配置。

0
0 Comments

为什么这个Web API路由没有被匹配到?

问题原因:

可能是由于解决方案中只有一个项目,导致路由冲突,使得多个控制器可以通过不同的URL进行访问。

解决方法:

将解决方案拆分为两个不同的项目,并分别进行配置。

第一个项目中的配置文件中的路由如下:

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

第二个项目中的配置文件中的路由如下:

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

在所选择的Web服务器中正确注册这些站点,问题就可以解决了。

这种方法可以避免多个控制器通过不同的URL进行访问的情况。

0