#c# #asp.net #web-services #webforms
#c# #asp.net #веб-сервисы #веб-формы
Вопрос:
Рассмотрим следующий код из-за страницы aspx:
protected void onBtnClick(object sender, EventArgs e)
{
}
Возможно ли создать / обработать POST
запрос (HttpWebRequest / HttpClient) для вызова обработчика событий за aspx-страницей?
Спасибо
Комментарии:
1. Не напрямую — вам понадобится какой-то интерфейс веб-сервиса, например ASP.NET MVC или метод веб-службы в старой устаревшей
.asmx
службе или службе WCF. ASP.NET Webforms (.aspx
) на самом деле не имеет никаких возможностей для вызова извне2. Это невозможно, потому что то, что требуется / ожидает этот обработчик событий, — это множество контекста о состоянии страницы, на которой была нажата кнопка. Нет прямого URL-адреса, который указывал бы на этот метод. Все это связано с asp.net жизненный цикл страницы webforms (который является неприятным, сложным зверем, который всегда не подходил для среды веб-приложения, в которую он был включен (скопирован с настольных winforms). Как говорит marc_s, вам нужен какой-то отдельный веб-сервис. ASP.NET предлагает целое меню вариантов в этой области.
Ответ №1:
Из любопытства я смог заставить это работать, но для этого требуются определенные изменения на вашей странице .aspx, которые вы, вероятно, не хотите делать (или не можете делать): <%@ Page EnableEventValidation="false"
также необходимо установить для вашего ClientIDMode значение static
Учитывая эту Test.aspx
разметку веб-формы:
<form id="form1" runat="server">
<asp:Button runat="server" OnClick="OnClick" Text="Click Me" ClientIDMode="Static" ID="Button1" />
</form>
И этот codebehind:
protected void OnClick(object sender, EventArgs e)
{
Response.Write("clicked");
}
Я смог опубликовать в Test.aspx с произвольной HTML-страницы (того же сайта) и OnClick
запустить, также Page.IsPostBack
было установлено значение true
:
<form method="post" action="Test.aspx">
<input type="hidden" name="Button1" value="Click Me" />
<input type="hidden" name="__VIEWSTATEGENERATOR" value="" />
<input type="hidden" name="__VIEWSTATE" value="" />
<input type="submit" value="submit" />
</form>
Опять же, это не рекомендуется, вероятно, открывает Test.aspx для всевозможных неприятных взломов.