繁体   English   中英

WebAPI返回404(未找到)

[英]WebAPI returns 404 (Not Found)

我创建了一个简单的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页)吗? 导航到domain / api / ,尽管存在/ api / dir,但仍未找到。 或许在Web.config ,最有可能是<system.webServer>部分,但是在SO上提供的解决方案(即,将ExtensionlessUrlHandler的路径更改为*而不是*. ),等等均无效。 在我给出的这个示例中,服务器传递了500错误。

您必须设置路径。

使用此代码,您发布了:

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

控制器的文件夹

我正在使用.net framework 4

在此处输入图片说明

这是我调用api/html/footer时的结果:

结果

您是否创建了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
}

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

如果不会进行任何普通的MVC调用,则可以安全地将routeTemplate更改为routeTemplate: "{controller}/{id}/"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM