Знатоки .NET есть?
3982
1
Picaro
гундос
Надо, чтобы некий aspx внутри страницы вызывался POST-ом. Ну вот хочется встроить в страницу свою логику, но чтоб вся текстовка хранилась в базе.
В частности, в текст статьи в базе встраиваем свою директиву <exec>something.aspx</exec>.
Для вызова собираем QueryString, заполняем Form и вызываем нужный apsx. Упрощенно это выглядит так:
HttpWebResponse rq = WebRequest.Create(url);
rq.Method = "POST";
rq.ContentType = "application/x-www-form-urlencoded";
HttpWebResponse rsp = rq.GetResponse();
Stream receiveStream = rsp.GetResponseStream();
Вроде, как-то работает. Но не устраивают следующие моменты:
1. Как передать данные FileUpload? Как их запихать в новый WebRequest? Если с Request.Form понятно, их пишем rq.RequestStream().Write(...). А куда файл запихать?
2. Эта зараза запускает aspx в другой сессии. Как объехать?
3. Едет форматирование. Например, "<asp:textbox runat="server" id="tb_email" width="400px" />" оформляется "<input name="ctl00$Content$tb_email" type="text" id="ctl00_Content_tb_email" />", то есть, без ширины, хотя при автономном запуске все нормально.
В частности, в текст статьи в базе встраиваем свою директиву <exec>something.aspx</exec>.
Для вызова собираем QueryString, заполняем Form и вызываем нужный apsx. Упрощенно это выглядит так:
HttpWebResponse rq = WebRequest.Create(url);
rq.Method = "POST";
rq.ContentType = "application/x-www-form-urlencoded";
HttpWebResponse rsp = rq.GetResponse();
Stream receiveStream = rsp.GetResponseStream();
Вроде, как-то работает. Но не устраивают следующие моменты:
1. Как передать данные FileUpload? Как их запихать в новый WebRequest? Если с Request.Form понятно, их пишем rq.RequestStream().Write(...). А куда файл запихать?
2. Эта зараза запускает aspx в другой сессии. Как объехать?
3. Едет форматирование. Например, "<asp:textbox runat="server" id="tb_email" width="400px" />" оформляется "<input name="ctl00$Content$tb_email" type="text" id="ctl00_Content_tb_email" />", то есть, без ширины, хотя при автономном запуске все нормально.
Вобщем, с post-ом разобрались.
Осталось выполнять новый запрос в той же сессии.
Из теории понятно, что для этого нужно передать ASP.NET_SessionID в куках.
Многие пишут, что надо создать HttpWebRequest, получить HttpWebResponse, прочитать куки и передать их в требуемый выполняемый HttpWebRequest. На самом деле, решение много проще. Ведь все куки уже есть в Page.Request, а запустить надо именно в его сессии.
И тут возникает грабля.
Если в Request.Headers("Cооkie") заменить ASP.NET_SessionID, например, на ASP.NET_SessionID1, все работает. Но, понятно дело, запускается в левой сессии. А вот если ASP.NET_SessionID присутствует, то иногда срабатывает, но в 99% заканчивается таймаутом.
Уже всю голову сломал. Ну никак не получается
Осталось выполнять новый запрос в той же сессии.
Из теории понятно, что для этого нужно передать ASP.NET_SessionID в куках.
Многие пишут, что надо создать HttpWebRequest, получить HttpWebResponse, прочитать куки и передать их в требуемый выполняемый HttpWebRequest. На самом деле, решение много проще. Ведь все куки уже есть в Page.Request, а запустить надо именно в его сессии.
rq As HttpWebRequest = HttpWebRequest.Create("http://...")
rq.UserAgent = Request.UserAgent
rq.Method = "POST"
rq.ContentType = "multipart/form-data; boundary=" & _boundary
rq.Headers.Add(HttpRequestHeader.Cооkie, Request.Headers("Cооkie"))
' Записать данные, которые будут доступны через Request.Form
' Записать данные, которые будут доступны через Request.Files
Dim resultStream As New StreamReader(rq.GetResponse().GetResponseStream(), Encoding.UTF8)
И тут возникает грабля.
Если в Request.Headers("Cооkie") заменить ASP.NET_SessionID, например, на ASP.NET_SessionID1, все работает. Но, понятно дело, запускается в левой сессии. А вот если ASP.NET_SessionID присутствует, то иногда срабатывает, но в 99% заканчивается таймаутом.
Уже всю голову сломал. Ну никак не получается