C# 如何仅为处理“MVC”项目的请求而托管WebApi
对于这个新项目,我们决定使用C# 如何仅为处理“MVC”项目的请求而托管WebApi,c#,asp.net,asp.net-mvc,asp.net-web-api,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,对于这个新项目,我们决定使用ASP.netmvc4作为表示层,使用WebApi 2作为服务层。其思想是-当用户与UI交互并发送一些请求时,MVC控制器正在接收该调用,如果有某种响应信息,MVC控制器将调用WebApi,其中WebApi是完全不同的解决方案,理论上,它可能与MVC解决方案在物理上不在同一位置 对于MVC部件,我有以下控制器: public async Task<ActionResult> Index() { return View("i
ASP.netmvc4
作为表示层,使用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)
);
}
}
在型号中
我有:
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}
当我右键单击视图
文件夹时,我选择安装一个空视图(无模型)
。基本上这就是我的设置。当我启动解决方案时,我得到以下信息:
HTTP错误403.14-禁止将Web服务器配置为不列出
此目录的内容
最可能的原因:未为配置默认文档
请求的URL,服务器上未启用目录浏览
以及其他必要时我会发布的内容。我的问题是——我如何才能做到这一点。如果我只是用
WebApi
模板创建一个MVC项目,我想一切都会很好,但这样做的全部意义都没有了。我希望能够独立于MVC解决方案托管WebApi
,即使是物理的,也只发送和接收调用。我认为这是来自服务器的完全有效的响应,因为您没有配置任何路由。MVC和Web API的路由配置不同。您可以阅读有关Web API路由的更多信息
我认为最简单的选择是从模板创建一个WebAPI项目。在VS2013中,当您创建新的web ASP.NET web应用程序时,可以选择要使用的模板。如果没有MVC,就不可能只选择Web API。创建项目后,您可以看到App\u Start
文件夹中有两个文件:WebApiConfig
和RouteConfig
<代码>路由图是MVC的路由。您只需删除此文件及其在Global.asax
中的用法即可
编辑:正如@EdSF所提到的,您实际上可以在没有MVC的情况下创建Web API项目。只需选择Empty
template并选中WebAPI复选框
因此,您的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 }
);
}
}
MapHttpAttribute路由
用于工作,而MapHttpRoute
类似于MVC。正如您所看到的,有一个api
前缀,您是否想使用它取决于您自己。总的来说,这不是一个坏主意。例如,如果将来您将有第二个版本的API,并且您也需要保留第一个版本,那么您可以添加新的前缀apiv2
或类似的内容
如果您不喜欢根目录的403.14响应,您可以为这种情况配置全局处理。阅读此示例。只是为了澄清前面关于没有MVC无法创建
WebAPI
项目的答案。您完全可以这样做并获得您想要的(仅限Web API的应用程序):
完成上述操作(已经有了必要的默认脚手架)并复制模型后,对控制器的唯一更改是:
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)
);
}
}
公共类用户控制器:ApiController
{
//处理对/api/{controller name}的GET请求
公共列表Get()
{
返回新列表{新用户{Name=“Peter”,年龄=41};
}
}
它是一个Web API应用程序,因此您不需要查看
要调用上述功能,请通过浏览器浏览至:
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>
答复(为简洁起见编辑):
Aleksandr Ivanov答案中的链接将非常有用,并将深入了解Web Api如何处理/路由请求
Hth…您在API项目中注册了WebApi路由吗?没有,我所做的一切都在我的帖子中描述。你能帮我一下吗?你应该有这样的东西:,或者这样:当我尝试使用config.Routes.maphttroute
和routeTemplate
时,我会出错,所以我用Routes.MapRoute
和url
更改了这些,但仍然不起作用。假设这是一个路由问题(我的第一次猜测),最好使用完整模板创建一个一次性项目。有多个WebApi包,我没有充分使用WebApi来告诉您需要什么。“没有MVC,只选择WebApi是不可能的”-不正确。您完全可以创建仅限Web API的项目。@EdSF感谢您的评论。我更新了答案。我自己也不知道这些特性。没什么大不了的,你的回答实际上对OP(WebAPI路由)很有帮助。贝斯特~@AleksandrIvanov确实很有用!谢谢,谢谢,这帮了我大忙。如果你有时间,问我一个问题。我正在使用Visual Studio Express 2013 for web
,当我在这一步中启动Nwe project->ASP.NET空web应用程序时,我没有看到检查WebApi
这是Express
版本中缺少的东西,还是我在步骤上缺少了/犯了错误?@Leron不幸的是,我没有使用/have Express…不确定如果你意识到了这一点,那么VS 2013 Pro的功能将得到充分发挥。
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}]