我正在开发一个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();
}
}
}
答案 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。内部服务器错误主要是抛出数据格式不正确而没有正确管理异常。