繁体   English   中英

C#:HttpWebRequest POST数据不起作用

[英]C#: HttpWebRequest POST data not working

我正在开发一个具有登录我的网站并下载文件功能的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();

        }
    }
}

当您获得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)

您可能在设置POST时遇到麻烦,因为您需要设置ContentType和长度:

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

如果您要考虑任何多字节字符,则可能还必须解决此问题,方法是在请求和stringbuilder上将编码设置为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);
}

在C#应用程序(服务器端Web API)中,使用(Ctrl + Alt + E)引发的服务器端异常启用C ++异常和公共语言运行时异常。

首先,您检查数据是否正确绑定。 之后,您可以看到什么是“精确异常”。 内部服务器错误多数情况下,抛出的数据格式不正确且管理不当异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM