HttpWebRequest提交Form和上传文件的认证问题
来源:互联网 发布:维纶触摸屏数据存储 编辑:程序博客网 时间:2024/04/30 00:07
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提交Form和上传文件的认证问题
- jqeury form 提交表单的问题(上传文件进度)
- .NET普通的form提交文件上传
- js提交form表单 - input file 文件上传控制上传文件的大小和格式
- Apache CXF REST 文件上传,form提交和json提交。
- Form提交,Ajax上传文件
- (转)利用HttpWebRequest上传文件应该注意的问题
- 使用jquery-form.js异步上传文件和提交表单
- form认证和windows认证间切换的问题
- 用jquery.form.js 实现ajax提交含有上传文件和普通字段的表单
- 基于jquery与jquery.form.js的表单文件流提交和上传体验提升
- 通过传统的form表单提交的方式上传文件
- Android中Form Post方式提交,上传文件的实现
- jquery提交带上传文件的form表单
- jQuery.form.js是一个form插件,支持ajax表单提交和ajax文件上传。
- 文件上传一之form提交
- Spring Mvc提交form表单上传文件
- juqery.form提交表单上传文件
- 打印异常信息 方法汇总
- QQ聊天
- MySql数据库基本操作
- csdn我的天地开通
- 今天听到的一个好消息和一个坏消息
- HttpWebRequest提交Form和上传文件的认证问题
- 不用输入用户名,让系统自动登陆
- 一个不错的 java初学者手册
- 正确理解和判断PR劫持的方法(站长必看)
- 利用System.EventHandler来实现两个窗体间的事件调用
- let your hose come on
- Codeblocks安装
- 网页制作(基础篇)
- ARM IAP升级方法