【问题标题】:complex parameter in ASP Web Api 2 GETASP Web Api 2 GET 中的复杂参数
【发布时间】:2014-08-31 08:53:13
【问题描述】:

我需要将复杂对象的列表传递给 GET 请求,以便我可以过滤结果。

复杂的对象是这样的:

public class RecordFilter
{
    public int PageNumber {get;set;}
    public int MaxRecordsPerPage {get;set;}
    public List<FilterElement> FilterElements {get;set;}
}

public FilterElement
{
    public string Name {get;set;}
    public object Value {get;set;}
    public bool IgnoreCase {get;set;}
}

现在我想像这样在 GET-Request 中将其作为参数传递:

api/test/records?PageNumber=1&MaxRecordsPerPage=10&FilterElements=%7B%22Name%22%3A%22test%22%2C%20%22Value%22%3A%22x%22%2C%20%22IgnoreCase%22%3A%20true%7D

这样解码:

api/test/records?PageNumber=1&MaxRecordsPerPage=10&FilterElements={"Name":"test", "Value":"x", "IgnoreCase": true}

它将在“FilterElements”-List 中添加一个元素,但该元素只有构造函数中的默认值(我使用的是 [FromURI])...

如何将我的对象列表传递给 Web 服务?

【问题讨论】:

    标签: c# get asp.net-web-api2


    【解决方案1】:

    通过在 GET 参数中放置 JSON 对象,您误用了 GET 方法。根据 w3c,GET 方法只能用于从 Web 服务(See w3schools.com)检索数据

    虽然这可能是风格问题,但还有另一个更实际的原因是不将“有效负载”放在 URL 参数中: URL 有长度限制。您传递的列表的大小可能会有所不同,并且您不确定 JSON 序列化列表是否总是比 URL 的最大长度短 (roughly 2000 characters by the way)

    我的建议是您在 Web 服务上构建一个 GET 一个 POST 方法。您可以通过从客户端调用 POST 方法将 FilterElement 列表传递给服务,如下所示:

    using (var wb = new WebClient())
    {        
        string url = "api/test/records"; //the URL to your web service
        var response = wb.UploadValues(url, "POST", FilterElements); //FilterElements being a list of objects you want to pass
    }
    

    然后您将列表存储在 Web 服务会话中(如 here 所示)。 (在此示例中,使用了原始类型,但 Session 也适用于复杂类型)。

    在 GET 方法中,您 read the list from the session,进行自定义过滤并返回过滤后的列表。

    【讨论】:

    • 这个解决方案很棒,正是我想要的!
    • 关于会议的最后一个问题。我像这样使用会话:_session=SessionStateUtility.GetHttpSessionStateFromContext(HttpContext.Current);但是当我在会话中添加一些值时,在我进行下一次 Web 服务调用后它们不再存在。我把它放到 global.aspx protected void Application_PostAuthorizeRequest() { HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);}
    • 在您的使用中包含“使用 System.Web”。然后使用 'HttpContext.Current.Session["FilterElementSorageKey"] = myFilterElementList' 将数据存储在 POST 方法中。要读取数据,请使用 'List myFilterElementsList = HttpContext.Current.Session["FilterElementSorageKey"]'
    • 谢谢。这行得通。我制作了一个简单的命令行工具来设置请求,但这无法正确处理会话。在我使用 firefox 插件 HTTPRequester 后一切正常。
    • 除了纯粹的风格,我为什么要第二次调用服务器? POST 可以返回结果,而不是将它们存储在会话中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多