使用C#,如何构造一个复杂的post对象以用于WebClient post? 背景

使用C#,如何构造一个复杂的post对象以用于WebClient post? 背景,c#,webclient,urbanairship.com,C#,Webclient,Urbanairship.com,在我的C#中间层中,我有一个计划任务,每分钟运行一次特定的业务逻辑,然后相应地向iOS和Android设备发送推送通知。我使用来促进推送通知,这意味着,在我的代码中,我只是调用它们的API,然后它们处理对各种设备的实际推送。下面是该代码的外观: public static void SendNotice(UaMessageModel messages) { var audience = new NameValueCollection { {"ali

在我的C#中间层中,我有一个计划任务,每分钟运行一次特定的业务逻辑,然后相应地向iOS和Android设备发送推送通知。我使用来促进推送通知,这意味着,在我的代码中,我只是调用它们的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; }
}

提前感谢。

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]));
Dictionary audencedictionary=accounter.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));
字典访问群体=新字典();
Add(“别名”,string.Join(“,”,messages.userid));
字典通知=新建字典();
通知。添加(“警报”,messages.Message);
Dictionary pushNotice=新字典();
Add(“受众”,新的JavaScriptSerializer().Serialize(受众));
添加(“通知”,新的JavaScriptSerializer().Serialize(通知));
编辑:


还可以看看这个答案:

谢谢你的回答,但据我所知,在使用
webclient
@MatthewPatrickCashatt发布时,你必须使用NameValueCollection,您可以使用Newtonsoft的JsonConvert类或内置的JavascriptSerializer类序列化字典,然后将json字符串转换为字节,并使用webClient.UploadData发布数据,如以下MSDN示例:,但我知道这可能不是您的最佳解决方案。
    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));