Вызовите обработчик событий aspx с http-запросом

#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 для всевозможных неприятных взломов.