0

WebClientを使用してサーバーにXMLデータを送信するSilverlightカスタムコントロールを開発しています。ファイルをアップロードした後、コールバック関数を実行する必要があります。それで、問題は、ファイルのアップロードが完了したことをどうやって知ることができるかということです。これが私が書いたコードです:

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

    }

それはすべて私には良さそうに見えましたが、2つの問題があります。1つは、ファイルのアップロードが完了したときにwc_OpenWriteCompletedが実際に実行されているかどうかはわかりません。どうすれば確認できますか?コールバック関数。ファイルが完全でない場合、何も実行されません。それはそのコールバックを戻すのに適切な場所ですか?最後に、呼び出しが行われた後、サーバーはいくつかのテストで応答しますが、それをコールバック関数に渡すにはどうすればよいですか?

4

1 に答える 1

0

サービスリクエストを作成して試すことができます。

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

サービスから結果を取得します。ObjectListResponseReady ファイルのアップロード後に確認応答するコールバック メソッドです。

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);
        }
}
于 2012-06-20T18:45:25.730 に答える