Добрый день. Мозг дошел до состояния "Спасите наши души" ну или хотя бы облейте холодной водой.
Есть приложение на C# и некий сервер в сетке с сайтом построенным на Django.
Есть задача приконнектиться из приложения, передать логин и пароль, получить идентификатор сессии и впоследствии в этой сессии отправить некоторые запросы.
Решать пытаюсь через HttpWebRequest и HttpWebResponse. Да, через WebClient я тоже пыталась. С тем же результатом. (
код
Функция возвращающая куки с идентификатором сессии:
private Cookie GetSessionCook()
{
string csrftoken = "";
Cookie TmpCookie = new Cookie();
//отправляем запрос чтобы получить форму логина.
HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create("host/accounts/login/");
httpRequest.Method = "GET";
httpRequest.CookieContainer = new CookieContainer();
HttpWebResponse httpWebResponse = (HttpWebResponse)httpRequest.GetResponse();
httpWebResponse.Cookies = httpRequest.CookieContainer.GetCookies(httpRequest.RequestUri);
if (httpWebResponse.Cookies != null)
{
//запоминаем свой csrftoken
csrftoken = httpWebResponse.Cookies[0].Value;
TmpCookie = httpWebResponse.Cookies[0];
}
httpWebResponse.Close();
//отправляем данные авторизации
httpRequest = (HttpWebRequest)WebRequest.Create("host/accounts/login/?next=/");
httpRequest.Method = "POST";
httpRequest.AllowAutoRedirect = false;
httpRequest.KeepAlive = true;
httpRequest.CookieContainer = new CookieContainer();
httpRequest.CookieContainer.Add(TmpCookie);
byte[] content = Encoding.UTF8.GetBytes(
"username=" + System.Web.HttpUtility.UrlEncode("username", Encoding.UTF8)
+ ";" +
"password=" + System.Web.HttpUtility.UrlEncode("password", Encoding.UTF8)
+ ";" +
"csrfmiddlewaretoken=" + System.Web.HttpUtility.UrlEncode(csrftoken, Encoding.UTF8));
Stream httpRequestStream = httpRequest.GetRequestStream();
httpRequestStream.Write(content, 0, content.Length);
httpRequestStream.Close();
//получаем идентификатор сессии для будущего использования
httpWebResponse = (HttpWebResponse)httpRequest.GetResponse();
StreamReader stream = new StreamReader(httpWebResponse.GetResponseStream());
httpWebResponse.Cookies = httpRequest.CookieContainer.GetCookies(httpRequest.RequestUri);
if (httpWebResponse.Cookies != null)
{
// Добавляем сессию в наш контейнер для дальнейшего использования
TmpCookie = httpWebResponse.Cookies[1];
sessionid = httpWebResponse.Cookies[1].Value;
}
stream.Close();
httpWebResponse.Close();
return TmpCookie;
}
Здесь пока все хорошо. Обменялись запросами, логин-пароль верные, получили какой-то идентификатор авторизированной сессии.
А далее самое интересное
public void SendPost(byte[] sentData)
{
Cookie TmpCookieSes = this.GetSessionCook();
HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(host + "/some_sсript_path/");
// Устанавливаем метод передачи данных в POST
httpRequest.Method = "POST";
httpRequest.KeepAlive = true;
httpRequest.ContentType = "application/x-www-form-urlencoded";
httpRequest.CookieContainer = new CookieContainer();
httpRequest.CookieContainer.Add(TmpCookieSes);
//отправка запроса
try
{
Stream requestStream = httpRequest.GetRequestStream();
requestStream.Write(sentData, 0, sentData.Length);
requestStream.Close();
WebResponse WebResp = httpRequest.GetResponse();
WebResp.Close();
}
catch (WebException we)
{
HttpWebResponse hwp = (HttpWebResponse)we.Response;
MessageBox.Show("Status Code = " + ((HttpWebResponse)we.Response).StatusCode + " Description = " + ((HttpWebResponse)we.Response).StatusDescription);
}
}
И собственно имею я в итоге Error 500 - Server Internal Error
Со стороны сервера говорят что ошибка Connection refused by peer и затрудняются ответить на чьей стороне ошибка и что мне еще попробовать.
Т.е. как я это понимаю, почему-то сессия идентификатор которой я даю оказывается закрытой... Но KeepAlive я вроде специально устанавливаю истинным.
Я, честно говоря, уже совершенно понимаю где я лажаю и что не так. Интернет поиск вошел в цикл и я отчаянно нуждаюсь в свежих мыслях.