C# HttpWebRequest的顺序

C# HttpWebRequest的顺序,c#,.net,http,web,httpwebrequest,C#,.net,Http,Web,Httpwebrequest,我目前正在自动化一个用于管理FTP用户的web界面 我正试图通过HttpWebRequest实现这一点,我有一个调用将我记录在该站点上,第二个调用是supose以添加新用户进行FTP访问 我在浏览器中尝试了我的两个URL,它们工作正常,最终创建了一个用户 string login = "https://www.ftpsite.net/./panel/index.php?txvUsername=myaccount&txvPassword=myPassword&submitButto

我目前正在自动化一个用于管理FTP用户的web界面

我正试图通过HttpWebRequest实现这一点,我有一个调用将我记录在该站点上,第二个调用是supose以添加新用户进行FTP访问

我在浏览器中尝试了我的两个URL,它们工作正常,最终创建了一个用户

string login = "https://www.ftpsite.net/./panel/index.php?txvUsername=myaccount&txvPassword=myPassword&submitButton=Login";
当我在浏览器地址栏中输入它时,它会让我登录

创建用户的第二个调用如下所示

string createUser = "https://www.ftpSite.net/panel/ftpsites/updatelogin?login_id=&login=toto123&realname=realnametoto&homedir=root&passwd=superpassword11&expdate=01-01-2100&neverExpire=on&quota_value=0&quota_unit=GB&group_id=0&status=on&ftp=on&filelist=on&ftp_download=on&http=on&web_filelist=on&web_download=on&email=";
当我在浏览器的地址栏中输入一个用户时,如果它跟在我们登录的地址栏后面,就会创建一个用户

我的问题是,我正试图使用HttpWebRequest来实现这一点,但没有成功。我可以让自己登录,但当我尝试创建用户时,似乎会返回一个“错误”错误代码,表示我已经创建了太多用户,但事实并非如此,因为我可以在该调用后创建更多用户。下面是我在HtttpRequest中使用的代码

        _datCookie = new CookieContainer();
        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(login);
        httpWebRequest.Method = "POST";
        httpWebRequest.CookieContainer = _datCookie;

        WebResponse response = httpWebRequest.GetResponse();
        referer = response.ResponseUri.AbsoluteUri;

        Stream requestStream = response.GetResponseStream();
        StreamReader streamReader = new StreamReader(requestStream);
        _datCookie = httpWebRequest.CookieContainer;
        response.Close();



        httpWebRequest = (HttpWebRequest)WebRequest.Create(createUser);
        httpWebRequest.CookieContainer = _datCookie;
        httpWebRequest.Referer = referer;
        httpWebRequest.Method = "POST";


        response = httpWebRequest.GetResponse();

        requestStream = response.GetResponseStream();
        streamReader = new StreamReader(requestStream);


        webBrowser.DocumentText = streamReader.ReadToEnd();

        response.Close();
我捕获并试图模仿的内容没有成功。

你确定它们应该是POST请求吗?URL似乎在查询字符串中包含所有字段,这表明它们应该是GET请求

根据Fiddler屏幕截图,您需要使用正文中的字段而不是查询字符串发出POST请求:

var cookies = new CookieContainer();

// Request 1 : Login
var request = (HttpWebRequest)WebRequest.Create("https://www.ftpsite.net/./panel/index.php");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.CookieContainer = cookies;

string postData = "txvUsername=myaccount&txvPassword=myPassword&submitButton=Login";
byte[] postBytes = Encoding.Default.GetBytes(postData);
request.ContentLength = postBytes.Length;
using (Stream bod = request.GetRequestStream())
{
   body.Write(postBytes, 0, postBytes.Length);
}

WebResponse response = request.GetResponse();
string referer = response.ResponseUri.AbsoluteUri;

// Request 2 : Create user
request = (HttpWebRequest)WebRequest.Create("https://www.ftpSite.net/panel/ftpsites/updatelogin");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.CookieContainer = cookies;

postData = "login_id=&login=toto123&realname=realnametoto&homedir=root&passwd=superpassword11&expdate=01-01-2100&neverExpire=on&quota_value=0&quota_unit=GB&group_id=0&status=on&ftp=on&filelist=on&ftp_download=on&http=on&web_filelist=on&web_download=on&email=";
postBytes = Encoding.Default.GetBytes(postData);
request.ContentLength = postBytes.Length;
using (Stream bod = request.GetRequestStream())
{
   body.Write(postBytes, 0, postBytes.Length);
}

response = request.GetResponse();
requestStream = response.GetResponseStream();
streamReader = new StreamReader(requestStream);
webBrowser.DocumentText = streamReader.ReadToEnd();
response.Close();
你确定它们应该是POST请求吗?URL似乎在查询字符串中包含所有字段,这表明它们应该是GET请求

根据Fiddler屏幕截图,您需要使用正文中的字段而不是查询字符串发出POST请求:

var cookies = new CookieContainer();

// Request 1 : Login
var request = (HttpWebRequest)WebRequest.Create("https://www.ftpsite.net/./panel/index.php");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.CookieContainer = cookies;

string postData = "txvUsername=myaccount&txvPassword=myPassword&submitButton=Login";
byte[] postBytes = Encoding.Default.GetBytes(postData);
request.ContentLength = postBytes.Length;
using (Stream bod = request.GetRequestStream())
{
   body.Write(postBytes, 0, postBytes.Length);
}

WebResponse response = request.GetResponse();
string referer = response.ResponseUri.AbsoluteUri;

// Request 2 : Create user
request = (HttpWebRequest)WebRequest.Create("https://www.ftpSite.net/panel/ftpsites/updatelogin");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.CookieContainer = cookies;

postData = "login_id=&login=toto123&realname=realnametoto&homedir=root&passwd=superpassword11&expdate=01-01-2100&neverExpire=on&quota_value=0&quota_unit=GB&group_id=0&status=on&ftp=on&filelist=on&ftp_download=on&http=on&web_filelist=on&web_download=on&email=";
postBytes = Encoding.Default.GetBytes(postData);
request.ContentLength = postBytes.Length;
using (Stream bod = request.GetRequestStream())
{
   body.Write(postBytes, 0, postBytes.Length);
}

response = request.GetResponse();
requestStream = response.GetResponseStream();
streamReader = new StreamReader(requestStream);
webBrowser.DocumentText = streamReader.ReadToEnd();
response.Close();


如果您的错误来自FTP站点,那么您需要查看它。你的要求可能没什么问题。这是您控制的站点,还是第三方ftp站点?这是第三方站点,我认为问题出在请求中,因为如果我在浏览器的地址栏中写入url和查询字符串,它就会工作。请使用fiddler,分析您从浏览器和http web请求中的请求。终端服务不知道您是如何生成请求的,除非它们之间存在差异。它应该是带有假用户id和所有其他参数的post请求,如内容长度、内容类型等。请让我知道结果。由于某些原因,Fiddler无法捕获登录帖子。您可能希望在问题中包含您的Fiddler。如果您的错误来自FTP站点,则您需要查看该错误。你的要求可能没什么问题。这是您控制的站点,还是第三方ftp站点?这是第三方站点,我认为问题出在请求中,因为如果我在浏览器的地址栏中写入url和查询字符串,它就会工作。请使用fiddler,分析您从浏览器和http web请求中的请求。终端服务不知道您是如何生成请求的,除非它们之间存在差异。它应该是带有假用户id和所有其他参数(如内容长度、内容类型等)的post请求。请让我知道结果。Fiddler由于某些原因无法捕获登录帖子。当我与Firebug检查其为post请求时,您可能希望将您的Fiddler包含在问题中,我只是不知道如何传递参数,否则。@denis mccraclejizz博士:如果你在Firebug中看到一个POST请求,这表明这是由你加载的页面发起的AJAX请求。如果是这样的话,你需要考虑从你的代码中复制这个请求。@denis mccraclejizz博士:问题是你用
HttpWebRequest
发出的请求似乎不是创建用户的请求。根据您的描述,当您在浏览器中打开URL时,页面上的脚本发出第二个请求,正是该请求创建了用户。我添加了fiddler的屏幕截图。啊,好的。它需要是一个POST请求,其中包含正文中的字段。我将用相关代码更新我的答案。当我与Firebug核对这是一个Post请求时,我只是不知道如何传递参数,否则。@denis mccraclejizz博士:如果你在Firebug中看到一个Post请求,这表明这是由你加载的页面发起的AJAX请求。如果是这样的话,你需要考虑从你的代码中复制这个请求。@denis mccraclejizz博士:问题是你用
HttpWebRequest
发出的请求似乎不是创建用户的请求。根据您的描述,当您在浏览器中打开URL时,页面上的脚本发出第二个请求,正是该请求创建了用户。我添加了fiddler的屏幕截图。啊,好的。它需要是一个POST请求,其中包含正文中的字段。我会用相关代码更新我的答案。