Silverlight POST请求并返回数据后保存文件

来源:互联网 发布:拍短片的软件 编辑:程序博客网 时间:2024/05/16 09:57

需要注意的地方:

1.HttpWebResponse 取Headers 的问题:

HttpWebResponse response = state as HttpWebResponse;
string result_code = response.Headers["RESULT_CODE"];

以上代码需要在应用的第一个构造函数中添加代码

bool registerResult = WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);

否则异常报错Headers方法没有被实现

2.SaveFileDialog在打开之后等待Http响应,使用响应数据来写文件,若同步等待那么用户线程将被阻塞,若异步在Http响应的回调函数中,sl处于安全考虑将不被允许在这里进行文件写入操作,那么只能使用SynchronizationContext,在Http回调函数中发送Post,而后转入用户线程,此时即可使用SaveFileDialog在OpenFile后得到的Stream进行文件写入,所以我们需要保留SaveFileDialog的文件Stream(sl中不能获取绝对路径的文件名)

3.url参数中的中文,在HttpWebRequest写入POST的请求参数时,转换为UTF-8字节流,而后在服务端使用UTF-8方式获取


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO;
using System.Text;
using System.Threading;
using System.Net.Browser;
using System.Windows.Resources;


namespace SilverlightApplication2
{
public partial class MainPage : UserControl
{
SynchronizationContext _syncContext;//同步上下文管理类
Stream _expFileStream = null;//导出文件的stream
byte[] _postData; //post的数据

public MainPage()
{
//没有此句在获取response的header时将异常:System.NotImplementedException: 该类没有实现这一属性。
bool registerResult = WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
InitializeComponent();
}


private void button1_Click(object sender, RoutedEventArgs e)
{
start();
}

void start()
{
SaveFileDialog sfd = new SaveFileDialog();
if (sfd.ShowDialog() == true)
{
_expFileStream = sfd.OpenFile();
}
else
{
return;
}

//string poststr = "data=测试中文&compress=false";
//_postData = Encoding.UTF8.GetBytes(poststr);
//start_request("http://10.111.43.18:8099/pmias/test");

string url = "http://10.111.43.18:8099/pmias/servlet/db_proc";
string poststr = "para=U003V7M8RcUNUICAvKisgcGFyYWxsZWwgKHQsMTYpIChhMCwxNikgKi8gYTAuTEVWRUwzX05BTUUgIGFzIGNuMCxOVkwodC5USFpDUywwKSBGUk9NICAoU0VMRUNUIEZLX0dERFcsTEVWRUwzX05BTUUgRlJPTSBETV9EX0dERFcgd2hlcmUgRktfR0REVyBpbiAoJzAwMDEwJywnMDAwMTInLCcwMDAxMycsJzAwMDE0JywnMDAwMTUnKSkgYTAgIExFRlQgSk9JTiAoU0VMRUNUIEZLX0dERFcsU1VNKE5WTChUSFpDUywwKSkgYXMgVEhaQ1MgRlJPTSBETV9GX0ZXWkxGWCBBQSAgV0hFUkUgIChTVUJTVFIoRktfREFURSwwLDYpPj0yMDExMTEgQU5EIFNVQlNUUihGS19EQVRFLDAsNik8PTIwMTExMSkgR1JPVVAgQlkgRktfR0REVykgdCBPTiAgKHQuRktfR0REVz1hMC5GS19HRERXKSAgT1JERVIgQlkgIGEwLkZLX0dERFcgO3RydWU7c2VsZWN0O0dCSzswYTsyYw%3D%3D";
_postData = Encoding.UTF8.GetBytes(poststr);
start_request(url);
}

void start_request(string url)
{
_syncContext = SynchronizationContext.Current;
Uri endpoint = new Uri(url, UriKind.Absolute);
HttpWebRequest request = WebRequest.Create(endpoint) as HttpWebRequest;
request.Method = "POST";
IAsyncResult asyncResult = request.BeginGetRequestStream(
new AsyncCallback(callback_resuest), request);
}
private void callback_resuest(IAsyncResult result)
{
HttpWebRequest request = result.AsyncState as HttpWebRequest;
request.ContentType = "application/x-www-form-urlencoded";

Stream requestStream = request.EndGetRequestStream(result);
requestStream.Write(_postData, 0, _postData.Length);
requestStream.Close();

request.BeginGetResponse(new AsyncCallback(callback_response), request);
}

void callback_response(IAsyncResult asyncResult)
{
HttpWebRequest request = asyncResult.AsyncState as HttpWebRequest;
WebResponse response = request.EndGetResponse(asyncResult);

_syncContext.Post(callback_ui, response);
}



private void callback_ui(object state)
{
HttpWebResponse response = state as HttpWebResponse;

string result_code = response.Headers["RESULT_CODE"];
string compress = response.Headers["COMPRESS"];

if (result_code == "OK")
{
//返回数据被压缩
if (compress == "true")
{
ZipUtil.ZipStream2File(_expFileStream, response.GetResponseStream());
//string result = ZipUtil.ZipStream2String(response.GetResponseStream());
//MessageBox.Show("解压缩:\n"+result.);
response.Close();
}
else
{
ZipUtil.Stream2File(_expFileStream, response.GetResponseStream());
//string result = ZipUtil.Stream2String(response.GetResponseStream());
//MessageBox.Show("未压缩:\n"+result);
response.Close();
}
MessageBox.Show("文件保存成功");
}
else
{
_expFileStream.Close();
MessageBox.Show(result_code);
}
}
}
}


原创粉丝点击