Получение разных откликов в зависимости от того, где выполняются HttpWebRequests - PullRequest
4 голосов
/ 15 сентября 2011

У меня возникают странные проблемы с выполнением кода в консольном приложении, в контроллере MVC и в библиотеке классов. В первых двух случаях я получаю ожидаемый ответ (в данном случае это zip-файл), но когда я пытаюсь выполнить код в библиотеке классов (зависимость в контроллере MVC), я получаю в своем ответе HTTP-статус 302 со странным перенаправить на страницу с ошибкой.

Так что странная часть в том, что он работает в моем консольном тестовом приложении и в контроллере MVC, но не как зависимость в моем проекте MVC. Есть ли разница в выполнении этого кода в контроллере по сравнению с библиотекой классов в качестве зависимости?

Я проверил запросы и ответы в Fiddler, но все идентично, кроме, конечно, ASP.NET SessionId, viewstate и содержимого ответа.

var cookies = new CookieContainer();

var firstRequest = (HttpWebRequest)WebRequest.Create("UrlToAspx");
firstRequest.Method = "GET";
firstRequest.KeepAlive = false;
firstRequest.CookieContainer = cookies;
var firstResponse = firstRequest.GetResponse() as HttpWebResponse;
var responseReader = new StreamReader(firstResponse.GetResponseStream());
var responseData = responseReader.ReadToEnd();
responseReader.Close();

var viewstate = ExtractViewstate(responseData);
var eventvalidation = ExtractEventValidation(responseData);

var postData = string.Format("__LASTFOCUS=&__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE={0}&__EVENTVALIDATION={1}&ctl00%24main%24ResultFormatGroup={2}&ctl00%24main%24DropDownList1={3}&&ctl00%24main%24fromDate={4}&&ctl00%24main%24tomDate={5}&&ctl00%24main%24ImageButton1.x={6}&&ctl00%24main%24ImageButton1.y={7}", viewstate, eventvalidation, "optExport", "Transaktioner", "2011-01-01", "2011-08-17", "7", "15");

var data = Encoding.UTF8.GetBytes(postData);

var request = (HttpWebRequest)HttpWebRequest.Create("UrlToAspx");
request.Method = "POST";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.Headers.Add("Accept-Encoding", "gzip, deflate");
request.Headers.Add("Accept-Language", "sv-SE");
request.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7");
request.Referer = "Referer";
request.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)";
request.ContentType = "application/x-www-form-urlencoded";
request.Host = "referer";
request.Headers.Add("Pragma", "no-cache");
request.CookieContainer = cookies;
request.KeepAlive = false;
request.ContentLength = data.Length;

var newStream = request.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();

var secondStream = new StreamReader(request.GetResponse().GetResponseStream());
var realResponseData = secondStream.ReadToEnd();

1 Ответ

0 голосов
/ 19 июня 2012

Измените заголовок хоста на домен, к которому вы пытаетесь получить доступ вместо использования реферера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...