2011-08-11 244 views
4

我有這種情況。 我們正在使用某種方法進行登錄,但該方法處於較高的抽象級別,因此它只有像username和password這樣的參數,並且使用此參數創建一些名稱值集合,並將其傳遞給某個請求構建器。這個請求構建器被注入以便我可以更改它的實現。現在我們使用POST請求,但將來我們可能會使用XML或JSON,因此只會切換注入接口的實現。將NameValueCollection發送到http請求C#

問題是,我不能罰款任何庫,這將使我的System.Net.HttpWebRequest這個名稱值集合。 我需要法的原型是這樣的:

WebRequest/HttpWebRequest CreateRequest(Uri/string, nameValueCollection); 

或者,如果沒有這樣的事情,做所有的工作(發送請求,接收響應和解析它們)將是一件好事庫。但它需要是異步的。

在此先感謝。

回答

9

我不是100%肯定,你想要的,但創建一個Web請求,將來自NameValueCollection中發佈一些數據,你可以使用類似這樣的內容:

HttpWebRequest GetRequest(String url, NameValueCollection nameValueCollection) 
{ 
    // Here we convert the nameValueCollection to POST data. 
    // This will only work if nameValueCollection contains some items. 
    var parameters = new StringBuilder(); 

    foreach (string key in nameValueCollection.Keys) 
    { 
     parameters.AppendFormat("{0}={1}&", 
      HttpUtility.UrlEncode(key), 
      HttpUtility.UrlEncode(nameValueCollection[key])); 
    } 

    parameters.Length -= 1; 

    // Here we create the request and write the POST data to it. 
    var request = (HttpWebRequest)HttpWebRequest.Create(url); 
    request.Method = "POST"; 

    using (var writer = new StreamWriter(request.GetRequestStream())) 
    { 
     writer.Write(parameters.ToString()); 
    } 

    return request; 
} 

但是,這些數據在發佈將取決於您接受的格式。這個例子使用查詢字符串格式,但是如果你切換到JSON或其他的東西,你只需要改變你處理NameValueCollection的方式。

+0

是啊,這是我需要什麼。 :)謝謝亞歷克斯。 – Vajda

+1

我做了類似的事情,最終發現NameValueCollection將會以字符串形式轉換爲html查詢字符串。所以不需要做字符串生成器。 – bygrace

0

從Web客戶端uploadvalues

NameValueCollection data; 

string str2 = string.Empty; 

StringBuilder builder = new StringBuilder(); 

foreach (string str3 in data.AllKeys) 
{ 
    builder.Append(str2); 
    builder.Append(UrlEncode(str3)); 
    builder.Append("="); 
    builder.Append(UrlEncode(data[str3])); 
    str2 = "&"; 
}