模擬動作比較麻煩,實務上這個需求我們是會在程式裡組一個 HTTP POST 送給目標的 action url後同樣在程式裡取回內容。(實際上你在表單填完的東西按下送出,瀏覽器也是幫你把它們組成 HTTP POST 送給 action url,再解析 Server 吐回來的內容成結果畫面給你看)
核心程式
url 為目標 action url 網址、parameters 為 form 裡參數的 key、val 組合(比如 input 的 name 跟 val),並以字串形式回傳結果,本例會用 json,如果你取的是 HTML 你可能還會需要 HTML parser。
- string _GetWebResponse(string url, NameValueCollection parameters)
- {
- // following line is to make sure when https certificate isn't valid the method will still work
- ServicePointManager.ServerCertificateValidationCallback =
- delegate { return true; };
- var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
- httpWebRequest.ContentType = "application/x-www-form-urlencoded";
- httpWebRequest.Method = "POST";
- var sb = new StringBuilder();
- foreach (var key in parameters.AllKeys)
- sb.Append(key + "=" + parameters[key] + "&");
- sb.Length = sb.Length - 1;
- byte[] requestBytes = Encoding.UTF8.GetBytes(sb.ToString());
- httpWebRequest.ContentLength = requestBytes.Length;
- using (var requestStream = httpWebRequest.GetRequestStream())
- {
- requestStream.Write(requestBytes, 0, requestBytes.Length);
- requestStream.Close();
- }
- Task<WebResponse> responseTask = Task.Factory.FromAsync<WebResponse>(
- httpWebRequest.BeginGetResponse, httpWebRequest.EndGetResponse, null);
- using (var responseStream = responseTask.Result.GetResponseStream())
- {
- var reader = new StreamReader(responseStream);
- return reader.ReadToEnd();
- }
- }
使用上是類似這樣
- // replace to ur target form parameters
- NameValueCollection nvc = new NameValueCollection();
- nvc.Add("Account", "acc123");
- nvc.Add("Password", "acc123");
- // replace to ur target action url
- string url = Url.Action("JsonRes", "Home", null, Request.Url.Scheme);
- string ret = _GetWebResponse(url, nvc);
- //var tmp = JsonConvert.DeserializeObject
(ret); return Json(ret, JsonRequestBehavior.AllowGet);
如果還不清楚可以到 Git 載範例(為MVC5,不過_GetWebResponse(...) 是 WebForm 也通用的)。
ref: StackOverFlow 、 暗黑執行緒(解決目標為 https 問題)
沒有留言:
張貼留言