2012-06-20 3 views
0

Я разрабатываю пользовательский элемент управления Silverlight, где я отправляю некоторые данные XML на свой сервер с помощью WebClient. После загрузки файла мне нужно запустить функцию обратного вызова. Итак, вопрос в том, как я знаю, что это была загрузка файла? Вот код, который я написал:Функция WebClient и callback

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 фактически работает, когда файл загружается. Как это подтвердить? Функция обратного вызова, если файл не завершен, он ничего не собирается делать. Это подходящее место, чтобы вернуть этот звонок? Наконец, сервер после некоторого теста отвечает на некоторые тесты, как я могу передать это на мою функцию обратного вызова?

ответ

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); 
     } 
} 
Смежные вопросы