c# - 根据执行 HttpWebRequest 的位置获得不同的响应

标签 c# .net asp.net-mvc-3 httpwebrequest

我在控制台应用程序、MVC Controller 和类库中执行代码时遇到了一些奇怪的问题。在前两种情况下,我得到了我期望的响应(在本例中是一个 zip 文件),但是当我尝试执行类库中的代码(依赖于我的 MVC Controller )时,我在响应中得到了 302 HTTP Status 和一个奇怪的重定向到错误页面。

所以奇怪的是它在我的控制台测试应用程序和 MVC Controller 中工作,但在我的 MVC 项目中不是作为依赖项。在 Controller 中执行此代码与作为依赖项在类库中执行此代码有什么不同吗?

我检查了 Fiddler 中的请求和响应,但除了 ASP.NET SessionId、viewstate 和响应内容之外,一切都是相同的。

var cookies = new CookieContainer();

var firstRequest = (HttpWebRequest)WebRequest.Create("UrlToAspx");
firstRequest.Method = "GET";
firstRequest.KeepAlive = false;
firstRequest.CookieContainer = cookies;
var firstResponse = firstRequest.GetResponse() as HttpWebResponse;
var responseReader = new StreamReader(firstResponse.GetResponseStream());
var responseData = responseReader.ReadToEnd();
responseReader.Close();

var viewstate = ExtractViewstate(responseData);
var eventvalidation = ExtractEventValidation(responseData);

var postData = string.Format("__LASTFOCUS=&__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE={0}&__EVENTVALIDATION={1}&ctl00%24main%24ResultFormatGroup={2}&ctl00%24main%24DropDownList1={3}&&ctl00%24main%24fromDate={4}&&ctl00%24main%24tomDate={5}&&ctl00%24main%24ImageButton1.x={6}&&ctl00%24main%24ImageButton1.y={7}", viewstate, eventvalidation, "optExport", "Transaktioner", "2011-01-01", "2011-08-17", "7", "15");

var data = Encoding.UTF8.GetBytes(postData);

var request = (HttpWebRequest)HttpWebRequest.Create("UrlToAspx");
request.Method = "POST";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.Headers.Add("Accept-Encoding", "gzip, deflate");
request.Headers.Add("Accept-Language", "sv-SE");
request.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7");
request.Referer = "Referer";
request.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)";
request.ContentType = "application/x-www-form-urlencoded";
request.Host = "referer";
request.Headers.Add("Pragma", "no-cache");
request.CookieContainer = cookies;
request.KeepAlive = false;
request.ContentLength = data.Length;

var newStream = request.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();

var secondStream = new StreamReader(request.GetResponse().GetResponseStream());
var realResponseData = secondStream.ReadToEnd();

最佳答案

将主机 header 更改为您尝试访问的域,而不是使用引荐来源网址。

关于c# - 根据执行 HttpWebRequest 的位置获得不同的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7422435/

相关文章:

c# - 绑定(bind)特定附加属性的值

c# - .NET 反射中的转换

asp.net - 如何使用 Html.ActionLink 在 a 标签中添加 span 标签

c# - EF 核心 : How to reuse same expression in different query contexts

c# - 如何在 C# 中按值而不是按引用复制对象

c# - 为什么这个多线程多连接的TCP服务器只接受一个连接?

c# - 读取本地帐户ini文件

c# - 同一解决方案中的不同 EntityFramework 版本

jquery - InsertionMode.Replace 如何在 Ajax.BeginForm 上工作

c# - 使用 SQL Server 帐户(2005 和 2008)