我创建了一个简单的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错误。
答案 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;
}
}
我在项目的根目录中创建了文件夹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
}
答案 1 :(得分:0)
根据您对将其添加到domain/api
的说法,然后根据配置,您的api现在已配置为domain/api/api/html/footer
。除非另外配置,否则默认情况下VS会在根上进行调试。
如果没有任何正常的MVC通话,您可以安全地将routeTemplate
更改为routeTemplate: "{controller}/{id}/"