[英]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.