【问题标题】:Using C#, how do I construct a complex post object for use in a WebClient post?使用 C#,我如何构造一个复杂的帖子对象以在 WebClient 帖子中使用?
【发布时间】:2014-04-05 15:50:16
【问题描述】:

背景

在我的 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 上时,我只看到pushNotice NameValueCollection 的键,但看不到值。我是否错误地构造了这个 NameValueCollection?

更多信息

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

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 urbanairship.com


    【解决方案1】:

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

        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

    【讨论】:

    • 感谢您的回答,但据我所知,您在使用webclient 发布时必须使用 NameValueCollection。
    • @MatthewPatrickCashatt,您可以使用 Newtonsoft 的 JsonConvert 类或内置的 JavascriptSerializer 类对字典进行序列化,然后将 json 字符串转换为字节并使用 webClient.UploadData 发布数据,如下 MSDN 示例:msdn.microsoft.com/en-us/library/tdbbwh0a(v=vs.110).aspx ,但我知道这可能不是您的最佳解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 2016-06-13
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    相关资源
    最近更新 更多