Для HTTP-запросов WebClient использует внутренние экземпляры объекта HttpWebRequest. HttpWebRequest позволяет включить/отключить автоматическое перенаправление с помощью свойства AllowAutoRedirect.
Чтобы получить доступ к объекту AllowAutoRedirect объекта HttpWebRequest, вы должны переопределить защищенный метод GetWebRequest класса WebClient. Чтобы просто отключить автоматическое перенаправление, этого было бы достаточно.
Если сервер отвечает на 302 (или аналогичный код, такой как 303), URL-адрес перенаправления можно найти в поле заголовка местоположения ответа. К счастью, WebClient предоставляет публичную коллекцию ResponseHeaders для легкого доступа к полям заголовка ответа.
Если вам нужно проверить фактический код состояния ответа, отправленный сервером, вам необходимо будет получить доступ к объекту HttpWebResponse, сгенерированному объектом HttpWebRequest. Аналогично доступу к объекту 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 это свойство будет содержать код состояния ответа последнего запроса, выданного веб-клиентом. Для любых других запросов (например, 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 ...
}
Это прекрасно работает. Спасибо за быстрый ответ. –