Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何仅为处理“MVC”项目的请求而托管WebApi_C#_Asp.net_Asp.net Mvc_Asp.net Web Api - Fatal编程技术网

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的应用程序):

  • 新项目
  • Asp.NETWeb应用程序
  • 空的
  • 检查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}]