【问题标题】:what is the best way to consume web api in mvc在 mvc 中使用 web api 的最佳方式是什么
【发布时间】:2016-05-10 01:51:50
【问题描述】:

我在我的 mvc 应用程序中使用 web api。我在 web api 中有一个方法,它使用 userId(在 session["userID"] 中)返回用户详细信息

public object getUserDetail()
{
  //here is need of session["userID"]
  // return somthing
}

那么从 jquery 访问这个 web api 方法的最佳方法是什么。我应该直接访问它还是首先我应该调用我的控制器方法,然后我应该从那里调用这个 web api 方法。

【问题讨论】:

  • 最好直接通过ajax调用..为什么要往返..??
  • 如果我直接调用 web api 方法而不是我如何在 web api 方法中获取会话值
  • 这只是理论上的答案。我们需要看看您的方法如何以及您的实际需求是什么。

标签: asp.net asp.net-mvc-4 asp.net-web-api


【解决方案1】:

您可以直接从 jquery 调用 WebApi 来执行操作(如插入/更新/删除),而不是返回 JSON 进行处理。对于需要操作视图的场景,请调用调用 Webapi 的 mvc 控制器。 因此,对于您的情况, getUserDetail() 方法返回数据。如果这些返回值需要在你的视图中使用,那么从 mvc 控制器中调用它

【讨论】:

    【解决方案2】:

    WebApi 已经是一个公开的端点,供您访问数据。转到您的控制器并从那里调用该方法会首先降低将该方法公开为 Api 的意图。尝试调用Api方法的路由,应该没问题。

    附带说明,尝试公开一个强类型对象,而不是仅仅返回一个对象。

    【讨论】:

    • 为什么要返回强类型对象而不是返回对象
    • 它阐明了您对 Api 方法要公开什么以及消费者应该期望什么的意图。
    【解决方案3】:

    从 jquery 访问这个 web api 方法的最佳方法是什么

    只需进行 ajax 调用。

       var url = www.example.com/api/user;
       $.ajax({
            type: 'GET',
            url: url,
            success: function(userValue) {
                // Do something with your user info...
            },
            error: function(error) {
               // Something went wrong. Handle error.
            }
        });
    

    让你的控制器返回值。

    public class UserController : ApiController
    {
        [HttpGet] // For clarity only
        public object Get()
        {
            // return your object.
            return session["userID"];
        }
    }
    

    要获取控制器的 url,您可以在视图中使用它。

    Url.HttpRouteUrl("DefaultApi", new {controller = "UserController "})})
    

    DefaultApi 是在您的路由表中定义的路由名称(通常在 RouteConfig.cs 中)。

    编辑:

    关于对会话的访问,有很多方法可以绕过它。看看这个问题,我想你会解决的。 Accessing Session Using ASP.NET Web API

    或者这个教程: http://www.codeproject.com/Tips/513522/Providing-session-state-in-ASP-NET-WebAPI

    public class SessionableControllerHandler : HttpControllerHandler, IRequiresSessionState 
    {
        public SessionableControllerHandler(RouteData routeData)
            : base(routeData)
        {}
    } 
    
    public class SessionStateRouteHandler : IRouteHandler 
    { 
        IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext)
        {
           return new SessionableControllerHandler(requestContext.RouteData);
        }
    }
    

    最后将其注册到您的路线中:

    RouteTable.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    ).RouteHandler = new SessionStateRouteHandler();  
    

    或将其添加到您的 Global.asax.cs

    protected void Application_PostAuthorizeRequest() 
    {
        System.Web.HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
    }
    

    【讨论】:

    • 我无法在 web api 中访问会话
    【解决方案4】:

    感觉您可能想退后一步重新考虑基础知识。这里的主要问题是:一个视图层(MVC)调用另一个视图层(Web API)听起来对吗?简单的答案是:不。

    通常的设置是您的 ajax 调用直接针对您的 Web Api 控制器方法。但是,如果出于某种原因你发现自己认为你真的需要你的 MVC 来调用 WebApi,那么它会寻找将业务逻辑提取到单独的层/层,所以你最终得到的是 MVC 和 Web API,在单独的类中调用相同的方法/layer(无论你的方法实际做什么)。

    所以,而不是:

        //this is in your MVC controller
        public ActionResult SomeMVCAction(){
        MyWebApiMethod();
        }
    
        //This is in your web api controller
        public SomeStrongType MyWebApiMethod(){
        var sum = 2+2;
        }
    

    你可能想要这样的东西:

    //this is in your MVC controller
    public ActionResult SomeMVCAction(){
    DoSum();
    }
    
    
    
    //This is in your web api controller
    public SomeStrongType MyWebApiMethod(){
    DoSum()
    }
    
    ///This function is defined in separate layer/project which is your business layer
    public static int DoSum(){
    return 2+2;
    }
    

    PS。 关于会话...在 WebApi 中无法(轻松)访问会话是有原因的。 REST Api 应该是无状态的,因此您可能需要重新考虑您需要在 Web api 控制器中进行会话的设计。 您可以通过访问 web api 控制器中的会话来描述您尝试解决的问题,然后我们可以尝试对此发表意见。

    【讨论】:

      猜你喜欢
      • 2021-07-28
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 2018-09-24
      • 2012-03-06
      • 2019-07-24
      • 2020-10-21
      相关资源
      最近更新 更多