C# WebClient和回调函数
我正在开发一个Silverlight自定义控件,使用WebClient向服务器发送一些XML数据。上传文件后,我需要运行回调函数。所以,问题是我如何知道上传文件已经完成? 以下是我编写的代码:C# WebClient和回调函数,c#,asp.net,silverlight,silverlight-4.0,C#,Asp.net,Silverlight,Silverlight 4.0,我正在开发一个Silverlight自定义控件,使用WebClient向服务器发送一些XML数据。上传文件后,我需要运行回调函数。所以,问题是我如何知道上传文件已经完成? 以下是我编写的代码: WebClient wc = new WebClient(); wc.OpenWriteCompleted += new OpenWriteCompletedEventHandler(wc_OpenWriteCompleted); Uri uri = new Uri(myUrl); wc.OpenWrit
WebClient wc = new WebClient();
wc.OpenWriteCompleted += new OpenWriteCompletedEventHandler(wc_OpenWriteCompleted);
Uri uri = new Uri(myUrl);
wc.OpenWriteAsync(uri, "POST", data);
...
private void wc_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e){
if (e.Error == null)
{
byte[] fileContent = e.UserState as byte[];
Stream outputStream = e.Result;
outputStream.Write(fileContent, 0, fileContent.Length);
outputStream.Flush();
outputStream.Close();
}
HtmlPage.Window.Invoke("callBackFunction");
}
这一切在我看来都很好,但有两个问题。我不确定上传完文件后wc_OpenWriteCompleted是否正在运行。我如何确认这一点?回调函数,如果文件不完整,它将不会执行任何操作。那是回电话的正确地点吗?最后,在调用完成后,服务器会进行一些测试,如何将测试传递给回调函数?您可以通过创建服务请求来尝试
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(SessionConstants.serviceURL, UriKind.Absolute));
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.BeginGetRequestStream(new AsyncCallback(ObjectListRequestReady), request);
然后将服务请求发送到服务器以上载文件
void ObjectListRequestReady(IAsyncResult asyncResult)
{
HttpWebRequest request = asyncResult.AsyncState as HttpWebRequest;
Stream stream = request.EndGetRequestStream(asyncResult);
Deployment.Current.Dispatcher.BeginInvoke(delegate()
{
SELECTED_NODE = SPSITETextBox.Text;
StreamWriter writer = new StreamWriter(stream);
writer.WriteLine("pass your data to upload on server");
writer.Flush();
writer.Close();
request.BeginGetResponse(new AsyncCallback(ObjectListResponseReady), request);
// ObjectListResponseReady is the callback method called after uploading the data.
});
}
void ObjectListResponseReady(IAsyncResult asyncResult)
{
try
{
HttpWebRequest request = asyncResult.AsyncState as HttpWebRequest;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult);
Deployment.Current.Dispatcher.BeginInvoke(delegate()
{
Stream responseStream = response.GetResponseStream();
XmlReader xmlReader = XmlReader.Create(responseStream);
});
}
catch (Exception ex)
{
Message.ErrorMessage("error: " + ex);
}
}
从服务中获取结果ObjectListResponseReady
是一种回调方法,在上传文件后会向您发出确认
void ObjectListRequestReady(IAsyncResult asyncResult)
{
HttpWebRequest request = asyncResult.AsyncState as HttpWebRequest;
Stream stream = request.EndGetRequestStream(asyncResult);
Deployment.Current.Dispatcher.BeginInvoke(delegate()
{
SELECTED_NODE = SPSITETextBox.Text;
StreamWriter writer = new StreamWriter(stream);
writer.WriteLine("pass your data to upload on server");
writer.Flush();
writer.Close();
request.BeginGetResponse(new AsyncCallback(ObjectListResponseReady), request);
// ObjectListResponseReady is the callback method called after uploading the data.
});
}
void ObjectListResponseReady(IAsyncResult asyncResult)
{
try
{
HttpWebRequest request = asyncResult.AsyncState as HttpWebRequest;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult);
Deployment.Current.Dispatcher.BeginInvoke(delegate()
{
Stream responseStream = response.GetResponseStream();
XmlReader xmlReader = XmlReader.Create(responseStream);
});
}
catch (Exception ex)
{
Message.ErrorMessage("error: " + ex);
}
}