webclientクラスを使用してファイルサーバーにファイルをアップロードする
-
06-07-2019 - |
質問
現在、Webアプリケーションからアップロードされたファイルを受信するアプリケーションがあります。そのファイルを、同じネットワーク上にあるファイルサーバーに転送する必要があります(ただし、常にそうであるとは限りません)。
C#.NETでwebclientクラスを使用しようとしました。
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);
}
192.168.1.28にあるマシンはファイルサーバーであり、共有c:\ Filesを持っています。 現時点では、ログインに失敗したユーザー名またはパスワードが間違っていますというエラーが表示されますが、エクスプローラーを開いてそのパスに正常にログインできます。リモートデスクトップを使用してログインすることもできるので、ユーザーアカウントが機能することがわかります。
このエラーに関するアイデアはありますか? そのようなファイルを直接転送することは可能ですか? webclientクラスまたは他のクラスを使用しますか?
解決
そのまま使用
File.Copy(filepath, "\\\\192.168.1.28\\Files");
UNCパスを介して公開されるWindowsファイル共有は、ファイルシステムの一部として扱われ、Webとは関係ありません。
使用される資格情報は、ASP.NETワーカープロセスの資格情報、または有効にした偽装です。正しく調整するためにそれらを調整できる場合は、これを行うことができます。
サーバー名の代わりにIPアドレスを使用しているため、問題が発生する可能性があります(Windowsの信頼設定により、ドメインを離れることができません-IPを使用すると、ドメインの詳細が隠されます)。 可能な限り、サーバー名を使用してください!
これが同じWindowsドメイン上になく、別のドメインアカウントを使用しようとしている場合、ユーザー名を" [domain_or_machine] \ [username]"として指定する必要があります
明示的な資格情報を指定する必要がある場合は、偽装のコーディングを調べる必要があります。ソリューション。
他のヒント
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);
}
}
}
}
IPアドレスを(RUNコマンドまたはネットワークドライブのマッピングを介して)手動で開くと、PCはパイプを介して資格情報を送信し、ファイルサーバーはDCから承認を受け取ります。
ASP.Netが試行すると、IISワーカーユーザーの使用が試行されます(他のいくつかの問題が一覧表示される偽装が有効になっていない限り)。従来、IISワーカーユーザーには、サーバー間(またはWebサーバー上の他のフォルダー内)で作業する権限がありません。