为什么这条Web Api路线没有起飞?

时间:2013-09-18 21:49:36

标签: routing asp.net-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:

Request URL:http://localhost:1352/cp/SwitchUser/123
Request Method:PUT
Status Code:404 Not Found

我一直使用默认的web api路由。我错过了什么?

3 个答案:

答案 0 :(得分:1)

我在一个小的测试web api项目中尝试了这些路由,一切正常。

但这是我的建议。 尝试在两个不同的项目中拆分您的解决方案。 第一个config.file将有

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

在您选择的网络服务器中正确注册这些网站,您就完成了。 这种方法应该有效。 此外,使用这种技术,您可以避免两个URL访问多个控制器的情况:api/someControllercp/someController

答案 1 :(得分:1)

我终于弄清楚发生了什么。

最初连接WebApi的人从未实际调用WebApiConfig.Register(GlobalConfiguration.Configuration);,因此我添加的配置当然没有影响Web Api。添加它来解决问题。

答案 2 :(得分:0)

您的应用程序很可能没有正确配置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动词。