C#:HttpWebRequest POST数据不起作用

时间:2017-07-19 05:39:39

标签: c# asp.net asp.net-mvc asp.net-mvc-4 httpwebrequest

我正在开发一个C#wpf应用程序,它具有登录我的网站并下载文件的功能。这个网站的行为有一个Authorize属性。我需要2个cookie才能下载文件,第一个cookie是我登录,第二个cookie(成功登录后提供)是我下载文件。所以我想出了在我的httpwebrequest / httpwebresponse之后保留我的cookie的流程。我正在查看我的发布流程,因为这可能是问题所在。这是我的代码。

void externalloginanddownload()
{
    string pageSource = string.Empty;
    CookieContainer cookies = new CookieContainer();

    HttpWebRequest getrequest = (HttpWebRequest)WebRequest.Create("login uri");
    getrequest.CookieContainer = cookies;
    getrequest.Method = "GET";
    getrequest.AllowAutoRedirect = false;

    HttpWebResponse getresponse = (HttpWebResponse)getrequest.GetResponse();

    using (StreamReader sr = new StreamReader(getresponse.GetResponseStream()))
    {
        pageSource = sr.ReadToEnd();
    }

    var values = new NameValueCollection
    {
                {"Username", "username"},
                {"Password", "password"},
        { "Remember me?","False"},
            };

    var parameters = new StringBuilder();

    foreach (string key in values.Keys)
    {
        parameters.AppendFormat("{0}={1}&",
            HttpUtility.UrlEncode(key),
            HttpUtility.UrlEncode(values[key]));
    }

    parameters.Length -= 1;

    HttpWebRequest postrequest = (HttpWebRequest)WebRequest.Create("login uri");
    postrequest.CookieContainer = cookies;
    postrequest.Method = "POST";

    using (var writer = new StreamWriter(postrequest.GetRequestStream()))
    {
        writer.Write(parameters.ToString());
    }

    using (WebResponse response = postrequest.GetResponse()) // the error 500 occurs here
    {
        using (var streamReader = new StreamReader(response.GetResponseStream()))
        {
            string html = streamReader.ReadToEnd();

        }
    }
}

2 个答案:

答案 0 :(得分:1)

当您获得WebResponse时,返回的cookie将在响应中,而不是在请求中(奇怪的是,即使您在请求时需要CookieContainer)。

您需要将响应对象中的cookie添加到CookieContainer,以便在下次请求时发送。

一个简单的方法:

for(var cookie in getresponse.Cookies) 
    cookies.Add(cookie)

由于响应中的cookie已经是cookie容器,您可以执行此操作(如果所有cookie都已存在,可能有助于检查null)

if (response.Cookies != null) cookies.Add(response.Cookies)

由于您需要设置ContentType和长度,因此您的POST也可能有问题:

myWebRequest.ContentLength = parameters.Length;
myWebRequest.AllowWriteStreamBuffering = true;

如果要考虑任何多字节字符,您可能必须通过在请求和字符串构建器上将编码设置为UTF-8,并将字符串转换为字节并使用该长度来解决这个问题。

另一个提示:如果没有用户代理,某些Web服务器代码会阻塞。尝试:

myWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";

如果您有任何多字节字符,最好这样做:

var databytes = System.Text.Encoding.UTF8.GetBytes(parameters.ToString());
myWebRequest.ContentLength = databytes.Length;
myWebRequest.ContentType = "application/x-www-form-urlencoded; charset=utf-8";
using (var stream = myWebRequest.GetRequestStream())
{
    stream.Write(databytes, 0, databytes.Length);
}

答案 1 :(得分:0)

在C#应用程序中(服务器端Web API)启用C ++异常和公共语言运行时异常使用(Ctrl + Alt + E)什么是服务器端异常它抛出。

首先检查数据是否正确绑定。之后你就可以看到它是什么Exact Exception。内部服务器错误主要是抛出数据格式不正确而没有正确管理异常。