Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebClient和回调函数_C#_Asp.net_Silverlight_Silverlight 4.0 - Fatal编程技术网

C# WebClient和回调函数

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

我正在开发一个Silverlight自定义控件,使用WebClient向服务器发送一些XML数据。上传文件后,我需要运行回调函数。所以,问题是我如何知道上传文件已经完成? 以下是我编写的代码:

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);
        }
}