为 WebClient 设置自定义 headers
Set custom headers for WebClient
我有一个网络客户端,我想连接多个供应商。
除了 uri 和数据之外,还需要考虑 headers,因为它们可能因供应商而异。围绕客户端,我有很多其他的东西-所以我想把这段代码写一次。
所以,我正在尝试创建一个具有所有主要功能的基本方法 - 类似于下面的示例 - 这将允许我填补调用函数的空白。
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()
或其他方式设置 headers?
我正在努力想出一种有效且无异味的模式。
由于方法 Post() 是 CustomWebClient 的一个 public 方法,因此通过 [= 为方法 post 设置所有必需的属性将是一个很好的设计19=] setter 或构造函数初始化。
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();
}
如果可能的 header 数量有限,您可以在 CustomWebClient
class 中将它们声明为 public enum
并创建 constructor
或 UploadString()
函数(无论您喜欢哪个)并将 enum
的值传递给它以相应地设置 header 。示例:
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
最吸引人的好处是消除了可能出现的拼写错误并为您提供 intelli-sense,因此您无需记住您的选项。
我有一个网络客户端,我想连接多个供应商。
除了 uri 和数据之外,还需要考虑 headers,因为它们可能因供应商而异。围绕客户端,我有很多其他的东西-所以我想把这段代码写一次。
所以,我正在尝试创建一个具有所有主要功能的基本方法 - 类似于下面的示例 - 这将允许我填补调用函数的空白。
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()
或其他方式设置 headers?
我正在努力想出一种有效且无异味的模式。
由于方法 Post() 是 CustomWebClient 的一个 public 方法,因此通过 [= 为方法 post 设置所有必需的属性将是一个很好的设计19=] setter 或构造函数初始化。
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();
}
如果可能的 header 数量有限,您可以在 CustomWebClient
class 中将它们声明为 public enum
并创建 constructor
或 UploadString()
函数(无论您喜欢哪个)并将 enum
的值传递给它以相应地设置 header 。示例:
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
最吸引人的好处是消除了可能出现的拼写错误并为您提供 intelli-sense,因此您无需记住您的选项。