1

重複するクエリ文字列キーを送信する必要があるサービスにデータを投稿しています (醜く、標準で指定されていません)。

リクエストを作成するために WebClient オブジェクトを使用しています。プロジェクトの他の場所で頻繁に使用されるため、引き続き使用したいと思います。

私がこれをするとき

 foreach(var f in formats)                
      client.QueryString.Add("formats", f);

&formats=format_1,format_2,format_3サービスがサポートしていないリストを取得します。

この昔ながらの醜さよりも優れた代替手段はありますか?

var extraQueryString = string.Empty;

extraQueryString += "?apiKey=" + TRANSCODE_KEY;
extraQueryString += "&fileKey=" + fileKey;

foreach (var f in formats)     
      extraQueryString += "&formats=" + f;

var response = client.UploadData(TRANSCODE_URI + "task" + extraQueryString , new byte[] { });
4

2 に答える 2

1

NameValueCollectionこれは、重複するキーがカンマで区切られているためです。メソッドを拡張しNameValueCollectionてオーバーライドし、Get必要な形式を返すようにすることができます。

public class DupeNVC: NameValueCollection
{
    private string _duplicateKey;
    public DupeNVC(string duplicateKey = null)
    {
        _duplicateKey = duplicateKey;
    }

    public override string Get(int index)
    {
        //check if duplicate key has been specified
        //if not, then call the default Get implementation
        if (!String.IsNullOrEmpty(_duplicateKey))
        {
            ArrayList list = (ArrayList)base.BaseGet(index);              

            int num = (list != null) ? list.Count : 0;
            if (num == 1)
            {
                return (string)list[0];
            }
            if (num > 1)
            {
                StringBuilder stringBuilder = new StringBuilder((string)list[0]);

                for (int i = 1; i < num; i++)
                {
                    //format our string and append the duplicate key specified
                    stringBuilder.AppendFormat("&{0}=", _duplicateKey);
                    stringBuilder.Append((string)list[i]);
                }
                return stringBuilder.ToString();                   
            }
            return null;
        }
        else
           return base.Get(index);
    }

} 

通常のように使用できますがNameValueCollection、コンストラクターで重複した文字列を渡すと、その重複したキーが検索され、上記の変更されたコードが実行されます (それ以外の場合は、デフォルトのbase.Getメソッドが使用されます。

DupeNVC dnvc = new DupeNVC("formats");

foreach(var f in formats)     
    dnvc.Add("formats", f);

webClient.QueryString = dnvc;

これは完全にはテストされていませんが、必要なクエリ文字列形式を出力するはずです。もちろん、これは重複キーのコレクションを取得することでさらに拡張できますが、これは現在の問題についてのアイデアを提供するためのものです。

于 2013-07-02T00:45:41.787 に答える