HttpWebRequest提交Form和上传文件的认证问题
使用HttpWebRequest 调用在SharePoint 上开发的一个上传页面上传文件和提交Form数据,方法是:
1、先通过GET的方法获取Upload .aspx页的内容,用正则表达式过滤出所有的input元素,重要的如__VIEWSTATE等:
- NetworkCredential credential = new NetworkCredential("userid", "password", "domain");
- CookieContainer cookieContainer = new CookieContainer();
- HttpWebRequest webRequest = HttpWebRequest.Create(url) as HttpWebRequest;
- webRequest.Method = "GET";
- webRequest.CookieContainer = cookieContainer;
- HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;
- Stream responseStream = webResponse.GetResponseStream();
- StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
- string responseStr = streamReader.ReadToEnd();
- ……
2、然后把Get取到的hidden域、需要输入的内容及文件内容编码POST到Web Server端,再读取Web Server的响应以判断是否上传成功:
- byte[] aryPostData = Encoding.UTF8.GetBytes(strPostData);
- FileStream fileStream = new FileStream(txtFile.Text, FileMode.Open, FileAccess.Read);
- byte[] aryFileData = new byte[fileStream.Length];
- fileStream.Read(aryFileData, 0, (int)fileStream.Length);
- fileStream.Close();
- byte[] aryBoundaryEnd = Encoding.UTF8.GetBytes("/r/n--" + boundary + "/r/n");
- webRequest = HttpWebRequest.Create(url) as HttpWebRequest;
- webRequest.CookieContainer = cookieContainer;
- webRequest.Credentials = credential;
- webRequest.Method = "OST";
- webRequest.ContentType = "multipart/form-data; boundary=" + boundary;
- webRequest.ContentLength = aryPostData.Length + aryFileData.Length + aryBoundaryEnd.Length;
- webRequest.CookieContainer = cookieContainer;
- webRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
- webRequest.Referer = referer;
- responseStream = webRequest.GetRequestStream();
- responseStream.Write(aryPostData, 0, aryPostData.Length);
- responseStream.Write(aryFileData, 0, aryFileData.Length);
- responseStream.Write(aryBoundaryEnd, 0, aryBoundaryEnd.Length);
- responseStream.Flush();
- responseStream.Close();
- try
- {
- webResponse = webRequest.GetResponse() as HttpWebResponse;
- responseStream = webResponse.GetResponseStream();
- streamReader = new StreamReader(responseStream, Encoding.UTF8);
- responseStr = streamReader.ReadToEnd();
- }
- catch (WebException exp)
- {
- if(exp.Response!=null)
- System.Diagnostics.Trace.WriteLine(((HttpWebResponse)exp.Response).StatusDescription;
- else
- System.Diagnostics.Trace.WriteLine(exp.Message);
- }
客户端和Web Server处于同一个NT域中,由于该站点采用了Windows集成认证 ,所以new 了一个NetworkCredential作为认证凭证,提供了用户名、密码和域名信息:
- NetworkCredential credential = new NetworkCredential("userid", "password", "domain");
- ...
- webRequest.Credentials = credential;
但是,虽然提供了正确的用户名和密码,每次在POST完Form数据后,从Web Server获取响应时:
- webResponse = webRequest.GetResponse() as HttpWebResponse;
总是报"Unauthorized"的错误,查看Web Server,文件已经成功传上去了,怪事
。
后来把认证凭证改成了:
- NetworkCredential credential = CredentialCache.DefaultCredentials as NetworkCredential;
- ...
- webRequest.Credentials = credential;
竟然不出错了,默认取当前登录到域的用户的帐户信息,正好与我当前的应用环境相附。
----------------------------------------------------------------------------------------------------------------------------
MSDN中对DefaultCredentials 的解释是:
CredentialCache.DefaultCredentials 属性
获取应用程序的系统凭据。
...
DefaultCredentials 属性仅适用于基于 NTLM、协商和 Kerberos 的身份验证。
DefaultCredentials 表示运行应用程序的当前安全上下文的系统凭据。对于客户端应用程序,这些通常是运行应用程序的用户的 Windows 凭据(用户名、密码和域)。对于 ASP.NET 应用程序,默认凭据是已登录的用户或正被模拟的用户的用户凭据。
ref: http://www.cnblogs.com/cowbird/archive/2005/03/04/113281.aspx
本文介绍如何使用HttpWebRequest实现文件上传与表单提交,并解决了集成认证导致的Unauthorized错误问题。通过使用DefaultCredentials替代自定义NetworkCredential,确保了上传过程的成功。
5万+

被折叠的 条评论
为什么被折叠?



