WebAPI返回404(未找到)

时间:2016-10-17 16:09:30

标签: c# asp.net-mvc-4 asp.net-web-api .net-4.0 asp.net-web-api-routing

我创建了一个简单的Web API来从 domain / api / html / footer 返回HTML字符串:

public class htmlController : ApiController
{
    // GET api/html
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/html/section
    public string Get(string id)
    {
        if (id == "footer") return "<div>FOO</div>";
        return null;
    }
}

未触动 WebApiConfig.cs

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

我将WebAPI添加到 domain / api / 文件夹中,该文件夹包含一个单独的项目(在其根文件夹中)。

是否可以将WebAPI项目放在根文件夹中?如果是这样,我如何修复它以在 / api / 文件夹上工作?如果没有,会发生什么? (当我从Visual Studio运行时, / api / html / api / html / footer / 都正常工作!

修改

这可能是一些IIS设置(即,它没有遇到index.htm / default.aspx / etc页面)?虽然 / api / 目录在那里,导航到 domain / api / 表示没有立即找到。或者也许在Web.config中,很可能是<system.webServer>部分,但提供的解决方案(即将 ExtensionlessUrlHandler 的路径更改为*而不是*.在SO等上没有工作。在我给出的这个例子中,服务器发出500错误。

2 个答案:

答案 0 :(得分:3)

您必须设置路线路径。

使用此代码发布:

public class htmlController : ApiController
{
    // GET api/html
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/html/section
    public string Get(string id)
    {
        if (id == "footer") return "<div>FOO</div>";
        return null;
    }
}

你有这些路线: GET:api/html GET:api/html/id

如果您想要从路由api/html/footer调用某些方法,则需要对其进行配置。你可以这样做:

[RoutePrefix("api/html")]
public class htmlController : ApiController
{
    // GET api/html
    [Route("footer")]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/html/section
    [Route("footer/{id}")]
    public string Get(string id)
    {
        if (id == "footer") return "<div>FOO</div>";
        return null;
    }
}

编辑.Net 4

我在项目的根目录中创建了文件夹domain/api,并以与您相同的方式添加了控制器:

public class HtmlController : ApiController
{
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    public string Get(string id)
    {
        if (id == "footer") return "<div>FOO</div>";
        return null;
    }
}

Controller's folder

我正在使用.net framework 4

enter image description here

这是我致电api/html/footer时的结果:

Result

您是否创建了WebApiConfig并添加到Global.asax

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

        config.Routes.MapHttpRoute(
            name: "DefaultApiWithAction",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new
            {
                id = RouteParameter.Optional,
                action = RouteParameter.Optional
            }
        );
    }
}

public class Global : System.Web.HttpApplication
{

    protected void Application_Start(object sender, EventArgs e)
    {

        WebApiConfig.Register(GlobalConfiguration.Configuration);
    }

    // ... the rest of your global.asax
}

答案 1 :(得分:0)

根据您对将其添加到domain/api的说法,然后根据配置,您的api现在已配置为domain/api/api/html/footer。除非另外配置,否则默认情况下VS会在根上进行调试。

如果没有任何正常的MVC通话,您可以安全地将routeTemplate更改为routeTemplate: "{controller}/{id}/"