对于这个新项目,我们决定使用ASP.NET MVC 4
作为我们的演示层,WebApi 2
作为服务层。这个想法是 - 当用户与UI交互并发送一些请求时,MVC控制器正在接收此调用,如果响应有某种信息,则从MVC控制器调用WebApi
其中WebApi
是完全不同的解决方案,理论上它可能与MVC
解决方案不在同一个地方。
对于MVC部分,我有这个控制器:
public async Task<ActionResult> Index()
{
return View("index", await GetUserAsync());
}
readonly string uri = "http://localhost:51120/api/user";
protected async Task<List<User>> GetUserAsync()
{
using (HttpClient httpClient = new HttpClient())
{
return JsonConvert.DeserializeObject<List<User>>(
await httpClient.GetStringAsync(uri)
);
}
}
然后我创建了一个ASP.NET Empty Web Application
解决方案。创建解决方案后,我从WebApi 2
安装了Nuget
,因此我的项目结构非常基本。我手动创建了Controllers
,Models
和Views
目录。在Controllers
我有一个文件:
public class UserController : ApiController
{
public List<User> GetStringAsync()
{
return new List<User> {new User { Name = "Peter", Age = 41}};
}
}
在Models
我有这个:
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}
当我右键单击View
文件夹时,我选择安装Empty view (without model)
。基本上这就是我的设置。当我开始解决方案时,我得到了这个:
HTTP错误403.14 - 禁止将Web服务器配置为不列出 这个目录的内容。
最有可能的原因:未配置默认文档 请求的URL,并且服务器上未启用目录浏览。
如果需要的话,我会发布的其他内容。我的问题是 - 我怎么能这样做。如果我只是使用WebApi
模板创建一个MVC项目,我想一切都会正常工作,但是那时doint的全部内容都缺失了。我希望能够独立于MVC解决方案托管WebApi
,甚至是物理上的,只发送和接听电话。
答案 0 :(得分:1)
我认为这是来自服务器的完全有效的响应,因为您没有配置任何路由。对于MVC和Web API,路由的配置不同。您可以阅读有关Web API路由here的更多信息。
我认为最简单的选择是从模板创建Web API项目。在VS2013中,当您创建新的Web ASP.NET Web应用程序时,您可以选择要使用的模板。如果没有MVC,则无法仅选择Web API。创建项目后,您可以看到App_Start
文件夹中有两个文件:WebApiConfig
和RouteConfig
。 RouteConfig
正在为MVC路由。您可以删除此文件,并将其用于Global.asax
。
编辑:正如@EdSF所提到的,你实际上可以创建没有MVC的Web API项目。只需选择Empty
模板并选中Web API复选框。
因此,您的WebApiConfig
将如下所示:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
MapHttpAttributeRoutes
用于使attribute routing工作,MapHttpRoute
与MVC类似。正如您所看到的那样,前缀为api
,如果您想使用它,则取决于您。一般来说,这不是一个坏主意。例如,如果将来您将拥有第二版API,那么您也需要保留第一个版本,然后您可以添加新的前缀apiv2
或类似的东西。
如果你不喜欢root的403.14响应,你可以为这种情况配置全局处理。例如,请阅读此question。
答案 1 :(得分:1)
只是为了澄清之前的答案,即没有MVC就无法创建Web Api
项目。你绝对可以做到并获得你想要的东西(仅限Web API的应用程序):
执行上述操作(已经具有必要的默认支架)并复制模型后,对控制器的唯一更改是:
public class UserController : ApiController
{
//Handle GET request to /api/{controller name}
public List<User> Get()
{
return new List<User> { new User { Name = "Peter", Age = 41 } };
}
}
这是一个Web API应用程序,因此您不需要Views
。
要通过浏览器调用上述内容,请浏览到:
http://localhost:123456/api/user
响应:
<ArrayOfUser xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/StandAloneWebApi.Models">
<User>
<Age>41</Age>
<Name>Peter</Name>
</User>
</ArrayOfUser>
这是XML,因为我通过浏览器调用它,而不是“要求”特定的响应。如果我将Accept
标头设置为application/json
,我将获得JSON。
e.g。使用curl
curl -H "accept: application/json" http://localhost:123456/api/user
回应(为简洁起见编辑):
< HTTP/1.1 200 OK
< Pragma: no-cache
< Content-Type: application/json; charset=utf-8
....
[{"Name":"Peter","Age":41}]
Aleksandr Ivanov的答案中的链接非常有用,可以深入了解Web Api如何处理/路由请求。
... H个