Pregunta

Estoy intentando cargar un archivo o flujo de datos a nuestro servidor web y no encuentro una forma decente de hacerlo.he probado ambos WebClient y WebRequest ambos tienen sus problemas.

Cliente Web
Agradable y fácil, pero no recibe ninguna notificación de que la carga asincrónica se ha completado y el UploadProgressChanged El evento no se devuelve con nada útil.La alternativa es convertir sus datos binarios en una cadena y usar UploadStringASync porque entonces al menos obtienes un UploadStringCompleted, El problema es que necesitas mucha RAM para archivos grandes, ya que codifica todos los datos y los carga de una sola vez.

Solicitud HttpWeb
Un poco más complicado, pero aún hace lo que se necesita, el problema que tengo es que, aunque se llama en un hilo en segundo plano (supuestamente), todavía parece estar bloqueando mi interfaz de usuario y todo el navegador hasta que se completa la carga, lo cual no parece del todo. bien.

El .net normal tiene algunas características apropiadas. WebClient métodos para Al cargar datos completados y progreso, pero estos no están disponibles en Silverlight .net...¡Gran omisión, creo!

¿Alguien tiene alguna solución? Necesito cargar varios archivos binarios, preferiblemente con un progreso, pero necesito realizar algunas acciones cuando los archivos hayan completado su carga.

Esperamos recibir ayuda con esto.

¿Fue útil?

Solución

La forma en que lo soluciono es a través de INotifyPropertyChanged y la notificación de eventos.

Lo escencial:

 public void DoIt(){
this.IsUploading = True;    

        WebRequest postRequest = WebRequest.Create(new Uri(ServiceURL));

        postRequest.BeginGetRequestStream(new AsyncCallback(RequestOpened), postRequest);
    }

private void RequestOpened(IAsyncResult result){
      WebRequest req = result.AsyncState as WebRequest;
   req.BeginGetResponse(new AsyncCallback(GetResponse), req);
    }

  private void GetResponse(IAsyncResult result)
        {
            WebRequest req = result.AsyncState as WebRequest;
              string  serverresult = string.Empty;
              WebResponse postResponse = req.EndGetResponse(result);

              StreamReader responseReader = new StreamReader(postResponse.GetResponseStream());

this.IsUploading= False;
}

 private Bool_IsUploading;
        public Bool IsUploading
        {
            get { return _IsUploading; }
          private  set
            {

                _IsUploading = value;

                OnPropertyChanged("IsUploading");
            }
        }

En este momento, Silverlight es un PiTA debido a las llamadas asíncronas dobles y triples.

Otros consejos

Gracias, el problema que puedo ver con el artículo es que no habla de Silverlight, y Silverlight tiene funciones limitadas, por alguna razón han eliminado algunos eventos y métodos necesarios para transferencias binarias sin ningún motivo.

Necesito usar Silverlight porque necesito/quiero cargar varios archivos y HTML no permite la carga de varios archivos.

Matt Berseth tuvo algunas ideas al respecto que podrían ayudar:

http://mattberseth.com/blog/2008/07/aspnet_file_upload_with_realti_1.html

@dan - Disculpas amigo, podría haber jurado que el artículo de Matt trataba sobre Silverlight, pero claramente no lo es.La culpa es de esos dos grandes vasos de tinto chileno que acabo de tomar.:-)

Esto era más o menos lo que estaba haciendo, el problema que tenía era que mi interfaz de usuario se estaba bloqueando.

Como sugeriste lo que ya estaba haciendo, supuse que el problema estaba en otra parte, así que usé el antiguo divide y vencerás para reducir el problema y no era el código de actualización real, fue mi intento de Despacho una solicitud para actualizar mi barra de progreso durante la carga del código de transmisión.

Gracias por el consejo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top