問題:ワークフローが非常に遅いため、RestSharp(これまで使用したことのない)を使用してrestful/MVC3で書き直そうとしています。これまでのところ、Webisteの最初のGETを実行できますが、最初のフォローアップPOST(チェックボックスをクリックし、[続行]ボタンをクリックして次のページに移動することをシミュレートします)を実行すると、次のエラー:405 - HTTP verb used to access this page is not allowed.
無効なメソッド(HTTP動詞)がアクセスを試みたため、探しているページを表示できません。
私はおそらくコードで何か間違ったことをしています。「スクリーンスクレイピング」を試みているウェブサイトでは、現在機能しているが非常に遅く、時代遅れの古い遅いワークフローファウンデーションがあるため、これらのタイプのリクエストが許可されていることを知っています。Webサイトはasp.netにあり、セッション状態が必要であることに注意してください。
これが私のコードです:
var client = new RestClient("https://thewebsite.com/");
var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.RequestFormat = DataFormat.Json;
var response = client.Execute(request);
string responseString = string.Empty;
if (response.StatusCode == HttpStatusCode.OK)
{
string ViewState = string.Empty;
string EventValidation = string.Empty;
request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.RequestFormat = DataFormat.Json;
responseString = HttpUtility.HtmlDecode(response.Content);
request.AddParameter("__EVENTTARGET", "");
request.AddParameter("__EVENTARGUMENT", "");
request.AddParameter("ctl00%24MainContent%24cbAgree", "on");
request.AddParameter("ctl00%24MainContent%24ctl01", "Continue");
//parses & adds the session variables from the raw html to keep the sessionstate
Match m = RegexMatch(responseString, @"<input(\s\w+?[^=]*?=""[^""]*?"")*?\s+?id=""(\S+?\s)*?__VIEWSTATE(\s\S+?)*?"".*?value=""(?<value>.*?)"" />");
if (m.Success)
ViewState = m.Groups["value"].Value;
m = RegexMatch(responseString, @"<input(\s\w+?[^=]*?=""[^""]*?"")*?\s+?id=""(\S+?\s)*?__EVENTVALIDATION(\s\S+?)*?"".*?value=""(?<value>.*?)"" />");
if (m.Success)
EventValidation = m.Groups["value"].Value;
if (!string.IsNullOrWhiteSpace(ViewState) && !string.IsNullOrWhiteSpace(EventValidation))
{
request.AddParameter("__VIEWSTATE", UrlEncode(ViewState));
request.AddParameter("__EVENTVALIDATION", UrlEncode(EventValidation));
}
response = client.Execute(request);
}
else
{
//error in the GET
responseString = response.StatusDescription + " --------------------" + HttpUtility.HtmlDecode(response.Content);
}