[英]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;
}
}
我已经在项目的根目录下创建了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.