IIS7.5 の WebDAVサーバーで、指定したフォルダにあるリソース(フォルダやファイル)の一覧を取得します。

HttpWebRequest.Method で "PROPFIND"を指定し、HttpWebRequestのHeadersに "Depth"(値は"1")を追加して接続し、ResponseStream を XmlReaderで取得しています。

sing System;
using System.IO;
using System.Net;
using System.Linq;
using System.Xml;
using System.Xml.Linq;

namespace WebDAV
{
    public class Program
    {
        static void Main(string[] args)
        {
            string uri = "一覧を取得するURI";
            HttpWebRequest webReq = (HttpWebRequest)HttpWebRequest.Create(uri);
            webReq.Method = "PROPFIND";

            // リソースおよびその直下のリソースを取得するので「1」を指定
            webReq.Headers.Add("Depth", "1");
            webReq.Credentials = new NetworkCredential("ユーザー名", "パスワード");

            HttpWebResponse res = (HttpWebResponse)webReq.GetResponse();

            // 結果ステータス取得 
            Console.WriteLine("Status Code: {0}", res.StatusCode);
            Console.WriteLine("");

            // リソースのフルパスを取得(指定したフォルダは除く)
            Stream strm = res.GetResponseStream();
            XmlReader xmlReader = XmlReader.Create(strm);
            var els = XElement.Load(xmlReader);

            var query = from x in els.Elements()
                        where x.Element("{DAV:}href").Value != uri
                        select new
                        {
                            href = x.Element("{DAV:}href").Value
                        };
            foreach (var item in query)
            {
                Console.WriteLine(item.href);
            }

            res.Close();
            strm.Close();

            Console.ReadLine();
        }
    }
}

 

ちなみに、返ってくるXMLは下記のような感じです。

xml

IIS7.5 のWebDAVサーバーにあるファイルやフォルダなどのリソースに対してコピー、移動、削除を行います。

 

コピー

HttpWebRequest.Methodプロパティに"COPY"を設定し、Destinationでコピー先のURIを指定します。

using System;
using System.IO;
using System.Net;

namespace WebDAV
{
    public class Program
    {
        static void Main(string[] args)
        {
            // HttpWebRequestを初期化、メゾットなど必要な設定を行う
            HttpWebRequest webReq = (HttpWebRequest)HttpWebRequest.Create("コピー元URI");
            webReq.Method = "COPY";
            webReq.Headers.Add("Destination", "コピー先URI");

            // 認証設定
            webReq.Credentials = new NetworkCredential("USERNAME", "PASSWORD");

            // 結果ステータス取得
            HttpWebResponse res = (HttpWebResponse)webReq.GetResponse();
            Console.WriteLine("Status Code: {0}", res.StatusCode);
            res.Close();

            Console.ReadLine();
        }
    }
}

 

移動

HttpWebRequest.Methodプロパティに"MOVE"を設定し、コピーと同様にDestinationに移動先のURIを指定します。

HttpWebRequest webReq = (HttpWebRequest)HttpWebRequest.Create("移動元URI");
webReq.Method = "MOVE";
webReq.Headers.Add("Destination", "移動先URI");

※上記以外の部分はコピーと同じです。

 

削除

HttpWebRequest.Methodプロパティに"DELETE"を設定します。

HttpWebRequest webReq = (HttpWebRequest)HttpWebRequest.Create("削除するURI");
webReq.Method = "DELETE";

※上記以外の部分はコピーと同じです。

 

上記のコードは必要最小限の指定しか行っていません。各操作の詳細については、RFCをご覧ください。

RFC2518
http://www.rfc-editor.org/rfc/rfc2518.txt

RFC2518 日本語訳
http://webdav.todo.gr.jp/download/rfc2518j.txt

IIS7.5 の WebDAV サーバーに対してC#でファイルのアップロードを行います。

今回は、"C:\temp\test.jpg"にあるファイルを"http://localhost/test.jpg"にアップロードしています。

using System;
using System.IO;
using System.Net;

namespace WebDAV
{
	public class Program
	{
    	static void Main(string[] args)
	    {
    	    // HttpWebRequestを初期化し、認証とメゾットを設定
        	HttpWebRequest webReq = (HttpWebRequest)HttpWebRequest.Create("http://localhost/test.jpg");
        	webReq.Credentials = new NetworkCredential("USERNAME", "PASSWORD");
        	webReq.Method = WebRequestMethods.File.UploadFile;

	        // アップロードするファイルをオープンし、HttpWebRequestにサイズを設定
    	    FileStream inStrm = new FileStream(@"C:\Temp\test.jpg", FileMode.Open);
        	webReq.ContentLength = inStrm.Length;

	        // ファイルをバッファに読み込み・サーバーへ書き込み
    	    using (Stream outStrm = webReq.GetRequestStream())
        	{
	            int bufSize = 1048576; // 1MB
    	        byte[] buffer = new byte[bufSize];
        	    int bytesRead = 0;

	            while ((bytesRead = inStrm.Read(buffer, 0, bufSize)) > 0)
    	            outStrm.Write(buffer, 0, bytesRead);

	            inStrm.Close();

    	        outStrm.Flush();
        	    outStrm.Close();
	        }

    	    // 結果取得(今回はヘッダとステータス)
        	HttpWebResponse res = (HttpWebResponse)webReq.GetResponse();
        	Console.WriteLine(res.Headers.ToString());
        	Console.WriteLine("Status Code: {0}", res.StatusCode);

	        res.Close();

	        Console.ReadLine();
    	}
	}
}

 

尚、ドライブにマップしてあれば、C#からでも通常のドライブと同じように行えます。
※WebDAVサーバーをZドライブにマップ済み

File.Copy(@"C:\temp\test.jpg", @"Z:\test.jpg");

※コードは例外処理を省略しています。

WebDAVのインストールと設定(IIS7.5)

前回、IIS7.5 で FTPSの設定を行いましたので、今回はC#から接続してファイル一覧を取得します。

参考サイト:
DOBON.NET - FtpWebRequest、FtpWebResponseクラスを使ってFTPサーバーにアクセスする。
http://dobon.net/vb/dotnet/internet/ftpwebrequest.html

上記サイトの「FTPサーバーのディレクトリのファイル一覧を取得する」に2箇所ほどコードを追加します。

1.今回は自己署名証明書(信頼できない証明書)を使用していますので、ServerCertificateValidationCallback で常にTrue(正常)を返すようにします。

ServicePointManager.ServerCertificateValidationCallback =
	new RemoteCertificateValidationCallback(
    	delegate(Object certsender, X509Certificate certificate, X509Chain chain,
        SslPolicyErrors sslPolicyErrors) { return true; });

 

2.SSL 接続を使用しますので、FtpWebRequest.EnableSsl プロパティ に True を設定します。

ftpReq.EnableSsl = true;

 

これで完成です。修正後のコードは下記のようになります。

using System;
using System.Net;
using System.IO;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;


namespace FTPS
{
    class Program
    {
        static void Main(string[] args)
        {
            ServicePointManager.ServerCertificateValidationCallback =
                new RemoteCertificateValidationCallback(
                    delegate(Object certsender, X509Certificate certificate, X509Chain chain,
                    SslPolicyErrors sslPolicyErrors) { return true; });


            FtpWebRequest ftpReq = (FtpWebRequest) FtpWebRequest.Create("ftp://localhost");
            ftpReq.EnableSsl = true;
            ftpReq.Credentials = new System.Net.NetworkCredential("FTPDemo", "hoge");

            ftpReq.Method = WebRequestMethods.Ftp.ListDirectory;
            ftpReq.KeepAlive = false;

            FtpWebResponse ftpRes = (FtpWebResponse)ftpReq.GetResponse();

            StreamReader sr = new StreamReader(ftpRes.GetResponseStream());
            string res = sr.ReadToEnd();

            Console.WriteLine(res);
            sr.Close();

            Console.WriteLine("{0}: {1}", ftpRes.StatusCode, ftpRes.StatusDescription);

            ftpRes.Close();

            Console.ReadLine();
        }
    }
}

FTPのインストール」,「ユーザーごとにホームディレクトリの設定」とFTPの設定を行ってきました。

前回までの設定だと通信内容はもちろん、ユーザー名もパスワードも暗号化されていませんので、FTPS (File Transfer Protocol over SSL/TLS) の設定を行い暗号化します。

今回はテストのため、サーバー証明書は自己署名証明書を使用します。自己署名入り証明書の発行については下記をご覧ください。※バインドする必要はありません。

IIS7+で自己署名入り証明書の発行

 

サーバーの設定

1. IISマネージャーを起動、「サイト」→「Default FTP Site」を選択します。

 

2.「FTPのSSL設定」を開きます。

101

 

3.SSL証明書で、証明書(今回は作成した自己署名証明書「FTP」)を選択、SSLポリシーで「SSL 接続が必要」を選択し、「操作」にある「適用」をクリックします。

102

 

サーバー側の設定はこれで完了です。では、クライアントから接続してみます。

 

クライアントの設定

今回は、クライアントにFTPSに対応している FileZilla Client(以下 FileZilla) を使用しますので、FileZillaを下記からダウンロードし、インストールします。

FileZilla
http://filezilla-project.org/

1.FileZilla を起動し、メニューから「ファイル」→「サイトマネージャ」と選択し、「サイトマネージャ」を表示します。

201s 

 

2.「Select Entry」で「自分のサイト」を選択し、「新しいサイト」を作成クリックします。

 

3.名前を適当につけて、右側(「一般」)で、FTPの設定を行います。サーバーの種類は「FTPES - 明示的なTLS/SSL上のFTP」を選択してください。

202s

例)

ホスト [ FTPサーバー名又はIPアドレス ]
ポート 21
サーバーの種類 FTPES - 明示的なTLS/SSL上のFTP
ログオンの種類 通常
ユーザー [ FTPユーザー名 ]
パスワード [ FTPユーザーのパスワード ]

 

4.設定が全て終わったら、「接続」ボタンをクリックします。今回は、自己署名証明書を使用しているため、「不明な証明書」とダイアログが表示されますが、「了解」ボタンをクリックして閉じれば、FTPサーバーに接続完了です。

キャプチャーで確認すると、AUTHコマンド後に暗号化されていることがわかります。
※IIS7.5 のFTPSは、AUTHコマンド実行後に暗号化通信を開始するExplicitモードです。

203