簡體   English   中英

使用C#,如何構造用於WebClient帖子的復雜帖子對象?

[英]Using C#, how do I construct a complex post object for use in a WebClient post?

背景

在我的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帖子仍然沒有任何響應。 當我僅使用一個簡單的平面后置對象時,此方法有效。 這是該代碼:

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)));
    }
}

提前致謝。

NameValueCollection不是字典。 JavascriptSerializer不會按預期方式對其進行序列化。 為了獲得預期的結果,您應該將NameValueCollection轉換為Dictionary。

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

要輸出值和鍵,您需要將NameValueCollection轉換為Dictionary,如下所示:

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

我們可以在代碼中使用Dictionary而不是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM