【问题标题】:Can you call GET and POST same time from web api controller?你可以从 web api 控制器同时调用 GET 和 POST 吗?
【发布时间】:2014-06-17 08:17:01
【问题描述】:

我希望能够从同一个 url (api/test...) 调用 GET 和 POST 请求,但我目前在以下代码行中遇到当前上下文错误:

[AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
//The name 'HttpVerbs' does not exist in the current context -- error. 

我在 MVC 命名空间中添加了,但由于我的应用程序是 web api,因此在声明 mvc 命名空间时会导致授权属性失效。

    [Authorize]
    [AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)] // error
    public HttpResponseMessage post([FromUri] Query query)
    {
        if (User.IsInRole("admin"))
        {

            IQueryable<data_qy> Data = null;

            if (!string.IsNullOrEmpty(query.name))
            {
                var ids = query.name.Split(',');

                var dataMatchingTags = db.data_qy.Where(c => ids.Any(id => c.Name.Contains(id)));

                if (Data == null)
                    Data = dataMatchingTags;
                else
                    Data = Data.Union(dataMatchingTags);
            }

            if (Data == null) 
                Data = db.data_qy;

            if (query.endDate != null)
            {
                Data = Data.Where(c => c.UploadDate <= query.endDate);
            }

            if (query.data_qy != null)
            {
                Data = Data.Where(c => c.UploadDate >= query.data_qy);
            }

            Data = Data.OrderByDescending(c => c.UploadDate);

            var data = Data.ToList();

            if (!data.Any())
            {
                var message = string.Format("No data found");
                return Request.CreateErrorResponse(HttpStatusCode.NotFound, message);
            }

            return Request.CreateResponse(HttpStatusCode.OK, data);
        }

        return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Access Denied, Please try again.");
    }

}

非常感谢任何建议。非常感谢。

【问题讨论】:

    标签: c# post asp.net-web-api get


    【解决方案1】:

    而不是写:

        [AcceptVerbs(HttpVerbs.Get|HttpVerbs.Post)]
    

    你试过了吗:

        [AcceptVerbs("GET","POST")]
    

    或者,甚至更好:

        [HttpGet]
        [HttpPost]
    

    ?

    HttpVerbs 类(在命名空间 System.Web.Mvc 中)特定于 MVC 项目,而不是 Web API。

    【讨论】:

    • 我之前尝试过这种方法,POST 请求不允许我过滤我的结果,而是抛出整个数据集。但是,POST 请求仅适用于[FromBody] 方法,但随后GET 会引发对象空错误。请指教。非常感谢
    • 这可能是一个不同的问题,但我认为您看到的行为受您如何构建 URI 以传递 query 参数的影响。此外,请确保您的控制器中没有其他名为 Get 的方法,因为它们将优先于具有 [HttpGet] 属性(或等效的 AcceptVerbs 属性)的方法。我已经设法用一个虚拟的Query 对象来为我工作,其中有两个字符串成员ab。然后我将 URI 构造如下:.../api/values/post?a=6&amp;b=8 并且参数按预期传递到方法中。
    • 嗨,非常感谢您的解释和帮助,我想问一个小问题,关于测试 GET 请求,为什么我会收到一个对象引用错误[Object reference not set to an instance of an object.],在线代码[query.name],当我使用[fromBody] 方法调用get 方法时,否则使用[fromUri] 可以正常工作。如果可能,请指教。非常感谢您的时间和帮助。
    • 如果我理解正确你在说什么,它没有设置的原因是因为 GET 请求没有正文(你不能将数据传递给 GET 请求POST 请求的请求正文)。所以它不能使用[FromBody],但它应该可以使用[FromUri],因为你传递的数据是URI的一部分。
    • 顺便说一句,您的要求超出了原始问题的范围。问一个单独的问题可能是个好主意。话虽如此,您可能试图用一个动作做太多事情。拥有两个链接到同一个私有方法的独立操作(Get 和 Post)可能是一个更好的主意。这样,您可以选择从 URI 中获取 GET 的输入参数,并从正文中获取 POST 的输入参数,然后将这些参数传递给您的私有“worker”方法来完成这项工作。这将是一种更简洁的方法,并且在我看来,从长远来看更易于维护。
    【解决方案2】:

    我不认为你可以在 web api 控制器中做到这一点,因为它是一个带有特定方法和特定接受动词的 REST 控制器。

    但也许你可以创建私有方法并使用路由配置来让它做你想做的事。不过没试过

    【讨论】:

      【解决方案3】:
      [AcceptVerbs("POST", "GET"), Authorize]
      [AcceptVerbs("POST", "GET")]
      

      是的。您可以在单个 WEB API 方法中使用多个动词。就我而言,WPF 应用程序接受 GET 方法而 Android 应用程序接受 POST 方法,所以我使用了多个动词(HTTP 方法)并且它有效。
      下面是示例:

      [Route("all")]
      [AcceptVerbs("POST", "GET"), Authorize]
      public IHttpActionResult All(yourParameterListHere)
      {
         //Your body;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-20
        • 2012-10-22
        • 1970-01-01
        • 2014-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多