Очень короткая суть aspx-страниц в том, что они содержат всю локальную информацию о сеансе в паре переменных с префиксом "__" в общем aspxform. Обычно это форма верхнего уровня, и все элементы формы будут ее частью, но я думаю, что это может варьироваться в зависимости от реализации.
Для конкретной реализации, с которой я имел дело, мне нужно было позаботиться о 2 из этих переменных состояния, а именно:
__VIEWSTATE
__EVENTVALIDATION.
Ваша цель - убедиться, что эти переменные отправлены в форму, которую вы отправляете, поскольку они могут быть частью той основной формы aspxform, о которой я упоминал выше, и вы, вероятно, отправляете форму, отличную от этой.
Когда браузер загружает страницу aspx, часть javascript передает эту информацию о сеансе в рамках взаимодействия asp сервер / клиент, но, конечно, мы не можем позволить себе такую роскошь с механизацией perl, поэтому вам придется вручную публиковать эти самостоятельно, добавив элементы в текущую форму с помощью mechanize.
В случае, который я только что решил, я в основном сделал это:
my $browser = WWW::Mechanize->new( );
# fetch the login page to get the initial session variables
my $login_page = 'http://www.example.com/login.aspx';
$response = $browser->get( $login_page);
# very short way to find the fields so you can add them to your post
$viewstate = ($browser->find_all_inputs( type => 'hidden', name => '__VIEWSTATE' ))[0]->value;
$validation = ($browser->find_all_inputs( type => 'hidden', name => '__EVENTVALIDATION' ))[0]->value;
# post back the formdata you need along with the session variables
$browser->post( $login_page, [ username => 'user', password => 'password, __VIEWSTATE => $viewstate, __EVENTVALIDATION => $validation ]);
# finally get back the content and make sure it looks right
print $response->content();