特定のカスタム ドキュメント ステータスが適用される場合に、ファイルを強制的に読み取り専用モードで開くにはどうすればよいですか? たとえば、ドキュメントは、作成、レビュー、承認など、さまざまな段階を経ることがあります。一度承認されると、誰もそれを変更することはできません。
ファイルの移動やコピーなど、特定の操作がサポートされていないことを WebDAV Server Engine for .NET API を介してクライアントに通知するにはどうすればよいですか。
3 に答える
「ファイルを強制的に読み取り専用モードで開くにはどうすればよいですか...」
Windowsエクスプローラー(Windows Shell / Miniredirector / WebFolders)とMS Officeを使用している場合は、アイテムのファイル属性を返すIMsItemを実装できます。IMsItem.GetFileAttributesメソッドの実装で、読み取り専用フラグを追加します。
/// <summary>
/// Returns Windows file attributes (readonly, hidden etc.) for this file/folder.
/// </summary>
/// <returns>Windows file attributes.</returns>
public FileAttributes GetFileAttributes()
{
if (Name.StartsWith("."))
{
return fileSystemInfo.Attributes | FileAttributes.Hidden;
}
return fileSystemInfo.Attributes | FileAttributes.ReadOnly;
}
ただし、このコードは、ファイルが他のユーザー/アプリケーションによって上書きされるのを実際に保護するものではありません。ファイルを変更から保護するには、ユーザーがIFile.Write実装でファイルを変更するのに十分な権限を持っているかどうかを確認する必要があります。
すべての場合にコピーおよび移動操作を禁止する場合は、次のようにします。
public override void CopyTo(IItemCollection folder, string destName, bool deep, MultistatusException multistatus)
{
throw new DavException("Cannot copy resource", DavStatus.NOT_ALLOWED);
}
public override void MoveTo(IItemCollection folder, string destName, MultistatusException multistatus)
{
throw new DavException("Cannot move resource", DavStatus.NOT_ALLOWED);
}
ある条件に基づいてリソースのコピー/移動/変更を禁止する場合は、カスタムハンドラーを使用することをお勧めします。
public Service(ILogger logger, bool isApplication)
{
...
MyCustomPutHandler handler = new MyCustomPutHandler();
handler.OriginalHandler = engine.RegisterMethodHandler("PUT", handler);
}
internal class MyCustomPutHandler : IMethodHandler
{
public IMethodHandler OriginalHandler { get; set; }
public void ProcessRequest(DavContextBase context, IHierarchyItem item)
{
if(<check condition>)
{
throw new DavException("Cannot change resource", DavStatus.Conflict);
}
if (item is IFolder)
{
...
}
else
{
OriginalHandler.ProcessRequest(context, item);
}
}
......
}
これがお役に立てば幸いです。
「ファイルの移動やコピーなど、特定の操作がサポートされていないことを WebDAV Server Engine for .NET api を介してクライアントに伝えるにはどうすればよいですか。」
OPTIONS リクエストに応答して返される Allow および Public ヘッダーから remove COPY および MOVE 動詞を削除できると仮定します (以下の例を参照)。電話する必要があります:
engine.RegisterMethodHandler("COPY", null);
engine.RegisterMethodHandler("MOVE", null);
ただし、私の経験によると、Microsoft Miniredirector と Microsoft Office はその後使用できなくなる可能性があります。Microsoft Office はファイルを読み取り専用として開く場合があります。MS Office と Miniredirector をサポートする必要がある場合は、すべての動詞を Allow ヘッダーと Public ヘッダーに保持することをお勧めします。Tarasが彼の回答で提案したように、 CopyTo および MoveTo 実装で DavException をスローするだけです。
オプションリクエストの例:
OPTIONS http://ajaxbrowser.com/Userb7d072f HTTP/1.1
translate: f
User-Agent: Microsoft-WebDAV-MiniRedir/6.0.6002
Host: ajaxbrowser.com
Content-Length: 0
Connection: Keep-Alive
HTTP/1.1 200 OK
Allow: COPY, DELETE, GET, HEAD, LOCK, MOVE, OPTIONS, POST, PROPFIND, PROPPATCH, PUT, REPORT, UNLOCK
Content-Length: 0
Accept-Ranges: bytes
Server: Microsoft-HTTPAPI/1.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: ACL, CANCELUPLOAD, CHECKIN, CHECKOUT, COPY, DELETE, GET, HEAD, LOCK, MKCALENDAR, MKCOL, MOVE, OPTIONS, POST, PROPFIND, PROPPATCH, PUT, REPORT, UNCHECKOUT, UNLOCK, UPDATE, VERSION-CONTROL
Access-Control-Allow-Headers: Overwrite, Destination, Content-Type, Depth, User-Agent, Translate, Range, Timeout, X-File-Size, X-Requested-With, If-Modified-Since, X-File-Name, Cache-Control
Access-Control-Max-Age: 2147483647
X-Engine: IT Hit WebDAV Server .Net v3.0.556.0 (Evaluation License)
DAV: 1, 2, 3
Public: COPY, DELETE, GET, HEAD, LOCK, MOVE, OPTIONS, POST, PROPFIND, PROPPATCH, PUT, REPORT, UNLOCK
MS-Author-Via: DAV
Date: Fri, 23 Nov 2012 20:26:51 GMT