2008-11-04 14 views
9

Actualmente tengo una aplicación que recibe un archivo cargado desde mi aplicación web. Ahora necesito transferir ese archivo a un servidor de archivos que esté ubicado en la misma red (sin embargo, puede que este no sea siempre el caso).Carga de archivos en el servidor de archivos mediante la clase webclient

Estaba intentando usar la clase webclient en C# .NET.

string filePath = "C:\\test\\564.flv"; 
    try 
    { 
     WebClient client = new WebClient(); 

     NetworkCredential nc = new NetworkCredential(uName, password); 

     Uri addy = new Uri("\\\\192.168.1.28\\Files\\test.flv"); 
     client.Credentials = nc; 
     byte[] arrReturn = client.UploadFile(addy, filePath); 
     Console.WriteLine(arrReturn.ToString()); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 

La máquina ubicada en 192.168.1.28 es un servidor de archivos y tiene un compartimiento c: \ Archivos. En este momento estoy recibiendo un error de Nombre de usuario o contraseña incorrectos de inicio de sesión, pero puedo abrir el explorador y escribir correctamente en esa ruta de acceso. También puedo iniciar sesión utilizando un escritorio remoto, así sé que la cuenta de usuario funciona.

¿Alguna idea de este error? ¿Es posible transferir un archivo directamente así? Con la clase webclient o tal vez alguna otra clase?

+0

¿Es la cuenta una cuenta de dominio, o una cuenta de máquina? – TheSoftwareJedi

+0

La cuenta es un usuario en la máquina. El problema es que nos estamos moviendo a una nueva arquitectura y tenemos 2 servidores de archivos agrupados y equilibrados de carga con una IP virtual. Entonces necesito poder enviar el archivo al VIP. – JustLogic

+1

Sé que usar el cliente web funciona si publico en una página. Pero quiero evitar eso y transferir directamente el archivo. ¿Hay una manera de hacer eso? – JustLogic

Respuesta

16

Sólo tiene que utilizar

File.Copy(filepath, "\\\\192.168.1.28\\Files"); 

Un fileshare ventanas expuestas a través de una ruta UNC es tratada como parte del sistema de archivos, y no tiene nada que ver con la web.

Las credenciales utilizadas serán las del proceso de trabajo ASP.NET o cualquier suplantación que haya habilitado. Si puede ajustar esos para hacerlo bien, esto se puede hacer.

Puede tener problemas porque está utilizando la dirección IP en lugar del nombre del servidor (la configuración de Windows Trust evita que salga del dominio: al utilizar IP, oculta los detalles de dominio). ¡Si es posible, use el nombre del servidor!

Si esto no está en el mismo dominio de las ventanas, y que está tratando de utilizar una cuenta de dominio diferente, tendrá que especificar el nombre de usuario como "[domain_or_machine] \ [nombre de usuario]"

Si necesita para especificar credenciales explícitas, deberá buscar en coding an impersonation solution.

+0

Quizás no funcione debido a los permisos. Puede usar System.IO.File.Copy solo si ejecuta el sitio web con un usuario que tenga los permisos necesarios. Por defecto, la aplicación web se ejecuta con un usuario local limitado para evitar problemas de seguridad. – Biri

+0

Se agregaron algunos detalles de permisos. De acuerdo: los permisos pueden ser complicados. – TheSoftwareJedi

+0

@TheSoftwareJedi ¿Es posible transferir el archivo al servidor de archivos sin almacenarlo en el servidor donde el archivo se cargó inicialmente desde la página web? – Alex

0

cuando abre manualmente la dirección IP (mediante el comando EJECUTAR o mapeando una unidad de red), su PC enviará sus credenciales por la tubería y el servidor de archivos recibirá la autorización del DC.

Cuando ASP.Net lo intente, intentará utilizar el usuario trabajador de IIS (a menos que la suplantación esté activada, lo que enumerará algunos otros problemas). Tradicionalmente, el usuario trabajador de IIS no tiene autorización para trabajar en todos los servidores (o incluso en otras carpetas en el servidor web).

3
namespace FileUpload 
{ 
public partial class Form1 : Form 
{ 
    string fileName = ""; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 

     string path = ""; 
     OpenFileDialog fDialog = new OpenFileDialog(); 
     fDialog.Title = "Attach customer proposal document"; 
     fDialog.Filter = "Doc Files|*.doc|Docx File|*.docx|PDF doc|*.pdf"; 
     fDialog.InitialDirectory = @"C:\"; 
     if (fDialog.ShowDialog() == DialogResult.OK) 
     { 
      fileName = System.IO.Path.GetFileName(fDialog.FileName); 
      path = Path.GetDirectoryName(fDialog.FileName); 
      textBox1.Text = path + "\\" + fileName; 

     } 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      WebClient client = new WebClient(); 

      NetworkCredential nc = new NetworkCredential("erandika1986", "123"); 

      Uri addy = new Uri(@"\\192.168.2.4\UploadDocs\"+fileName); 

      client.Credentials = nc; 
      byte[] arrReturn = client.UploadFile(addy, textBox1.Text); 
      MessageBox.Show(arrReturn.ToString()); 

     } 
     catch (Exception ex1) 
     { 
      MessageBox.Show(ex1.Message); 
     } 
    } 
} 
} 
Cuestiones relacionadas