对于基于http的请求,WebClient在内部使用HttpWebRequest对象实例。 HttpWebRequest允许通过其AllowAutoRedirect属性启用/禁用自动重定向。
要访问并调整HttpWebRequest对象的AllowAutoRedirect属性,您可以覆盖WebClient类的受保护方法GetWebRequest。要简单地禁用自动重定向,这就足够了。
如果服务器使用302(或类似的代码,如303)进行响应,则可以在响应的位置标题字段中找到重定向URL。幸运的是,WebClient提供了一个公开的ResponseHeaders集合以方便访问响应头字段。
如果您需要检查服务器发送的实际响应状态代码,则需要访问由HttpWebRequest对象生成的HttpWebResponse对象。以类似的方式访问HttpWebRequest对象,WebClient有一个受保护的方法,您可以覆盖以访问HttpWebResponse对象:GetWebResponse(...)。 GetWebResponse具有用于异步操作的重载。通常,这种超载也应该以相同的方式被覆盖。
一个简单的实现自定义WebClient类装修你的基本需求可能类似于这样的:
public class CustomWebClient : WebClient
{
public HttpStatusCode? ResponseStatusCode { get; set; }
protected override WebRequest GetWebRequest(Uri url)
{
WebRequest req = base.GetWebRequest(url);
if (req is HttpWebRequest)
{
((HttpWebRequest) req).AllowAutoRedirect = false;
}
return req;
}
protected override WebResponse GetWebResponse(WebRequest request)
{
WebResponse resp = base.GetWebResponse(request);
ResponseStatusCode = (resp is HttpWebResponse) ?
((HttpWebResponse) resp).StatusCode
: (HttpStatusCode?) null;
return resp;
}
protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
{
WebResponse resp = base.GetWebResponse(request, result);
ResponseStatusCode = (resp is HttpWebResponse) ?
((HttpWebResponse) resp).StatusCode
: (HttpStatusCode?) null;
return resp;
}
}
注意,上面的属性ResponseStatusCode的实施是一个可空类型。对于基于http的请求,此属性将保存Web客户端发出的最后一个请求的响应状态码。对于任何其他类型的请求(如ftp),此属性的值将设置为null。
在您的应用程序,你可以使用这个简单的CustomWebClient类是这样的:
var client = new CustomWebClient();
byte[] response = client.UploadFile("http://test.com", "POST", "upload.jpg");
if (client.ResponseStatusCode == HttpStatusCode.Found)
{
string redirectUri = client.ResponseHeaders[HttpResponseHeader.Location];
... do something with the redirection Uri ...
}
这完美的作品。感谢您的快速响应。 –