使用 C#,如何构造一个复杂的帖子对象以在 WebClient 帖子中使用

本文关键字:对象 WebClient 复杂 何构造 一个 使用 | 更新日期: 2023-09-27 17:56:43

Background

在我的 C# 中间层中,我有一个计划任务,该任务每分钟运行一次某些业务逻辑,然后相应地向 iOS 和 Android 设备发送推送通知。 我使用 Urban Airship 来促进推送通知,这意味着在我的代码中,我只是调用他们的 API,然后他们处理对各种设备的实际推送。 该代码如下所示:

public static void SendNotice(UaMessageModel messages)
{
    var audience = new NameValueCollection
        {
            {"alias", string.Join(", ", messages.UserIds)}
        };
    var notification = new NameValueCollection
        {
            {"alert", messages.Message}
        };
    var pushNotice = new NameValueCollection
        {
            {"audience", new JavaScriptSerializer().Serialize(audience)},
            {"notification", new JavaScriptSerializer().Serialize(notification)}
        };
    //ToDo: remove "validate" from URL when done testing.
    Utilities.PostWebRequest("https://go.urbanairship.com/api/push/validate/", "Basic XXXXXXXXX", pushNotice, "application/vnd.urbanairship+json; version=3;");
}

public class UaMessageModel
{
    public List<int> UserIds { get; set; }
    public string Message { get; set; }
}

问题

当我在 Utilities.PostWebRequest 处放置断点并将鼠标悬停在 pushNotice 上时,我只看到 NameValueCollection pushNotice的键,而看不到值。 我是否正确构造了此名称值集合?

更多信息

无论pushNotice构造是否正确,我仍然没有得到WebClient帖子的任何回复。 当我只使用一个简单的平面发布对象时,此方法有效。 这是该代码:

public static dynamic PostWebRequest(string url, string token, NameValueCollection obj, string accept)
{
    using (var wc = new WebClient())
    {
        wc.Headers.Add("Authorization", token);
        wc.Headers.Add("Accept", accept);
        return GetObjectFromJson(Encoding.UTF8.GetString(wc.UploadValues(url, "POST", obj)));
    }
}

提前谢谢。

使用 C#,如何构造一个复杂的帖子对象以在 WebClient 帖子中使用

NameValueCollection 不是字典。JavascriptSerializer 不会像你期望的那样序列化它。要获得预期的结果,您应该将 NameValueCollection 转换为字典。

    NameValueCollection audience = new NameValueCollection();
    Data.Add("alias", "foobar");
    Data.Add("alias", "foobar2");

要输出值和键,您需要将 NameValueCollection 转换为字典,如下所示:

    Dictionary<string, string> audienceDictionary = audience.AllKeys.ToDictionary(k => k, k => source[k]));

我们可以在代码中使用字典而不是NameValueCollection:

    Dictionary<string, string> audience = new Dictionary<string, string>();
    audience.Add("alias", string.Join(", ", messages.UserIds));
    Dictionary<string, string> notification = new Dictionary<string, string>();
    notification.Add("alert", messages.Message);
    Dictionary<string, string> pushNotice = new Dictionary<string, string>();
    pushNotice.Add("audience", new JavaScriptSerializer().Serialize(audience));
    pushNotice.Add("notification", new JavaScriptSerializer().Serialize(notification));

编辑:

也看看这个答案:https://stackoverflow.com/a/7003815/2488939