2015-11-03 149 views
0

我有一個webclient,我想與多個供應商連接。爲WebClient設置自定義標頭

除了uri和數據之外,還有頭文件需要考慮,因爲它們可能因供應商不同而不同。圍繞客戶端,我有很多其他的東西 - 所以我想寫這個代碼一次。

所以,我試圖創建一個基本方法,它具有所有主要功能 - 類似下面的例子 - 這將允許我填寫調用函數的空白。

public string Post() 
    { 
     try 
     { 
      var client = new CustomWebClient(); 

      return client.UploadString("", ""); 
     } 
     catch (WebException ex) 
     { 
      switch (ex.Status) 
      { 
       case WebExceptionStatus.Timeout: 
        break; 
       default: 
        break; 
      } 

      throw new Exception(); 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(); 
     } 
     finally 
     { 
      client.Dispose(); 
     } 
    } 

顯然很容易在地址和數據作爲參數傳遞,但我怎麼可以設置使用client.Headers.Add()什麼標題?

我正在努力想出一個模式,工作,沒有氣味。

+0

你可以'client.Headers.Add(「test」,「test」);' –

回答

2

由於Post()方法是CustomWebClient的公共方法,因此通過屬性設置器或構造函數初始化爲方法後置設置所有必需的屬性將是一個很好的設計。

public class CustomWebClient 
{ 
    public NameValueCollection Headers 
    { 
     get; 
     set; 
    } 

    public CustomWebClient() 
    { 
     this.Headers = new NameValueCollection(); 
    } 

    //Overload the constructor based on your requirement. 

    public string Post() 
    { 
     //Perform the post or UploadString with custom logic 
    }  

    //Overload the method Post for passing various parameters like the Url(if required) 
} 

在正在使用的CustomWebClient的地方,

using (CustomWebClient client = new CustomWebClient()) 
{ 
    client.Headers.Add("HeaderName","Value"); 
    client.Post(); 
} 
+0

聽起來像一個計劃! –

1

如果可能的話頭的數量是有限的,你可以在你的CustomWebClient類聲明爲public enum創造要麼過載constructorUploadString()函數(無論你喜歡哪一個),並將它傳遞給enum的值以相應地設置標題。例如:

public class CustomWebClient { 
    public enum Headers { StandardForm, Json, Xml } 

    public CustomWebClient() { 
    } 

    //This is your original UploadString. 
    public string UploadString(string x, string y) { 
     //Call the overload with default header. 
     UploadString("...", "...", Headers.StandardForm); 
    }  


    //This is the overloaded UploadString. 
    public string UploadString(string x, string y, Headers header) { 
     switch(header){ 
     case Headers.StandardForm: 
      client.Headers.Add("Content-Type","application/x-www-form-urlencoded"); 
      break; 
     case Headers.Json: 
      client.Headers.Add("Content-Type","text/json"); 
      break; 
     case Headers.Xml: 
      client.Headers.Add("Content-Type","text/xml"); 
      break; 
     } 
     //Continue your code. 
    }  
} 

使用enum是消除可能的拼寫錯誤,併爲您智能影音感,這樣你就不需要記住你的選擇是什麼最吸引人的優點。