在某些自定义文档状态适用的情况下,如何强制以只读模式打开文件?例如,一个文档可以经历不同的阶段:创建、审查、批准。一旦它被批准,任何人都不能修改它。
如何通过适用于 .NET api 的 WebDAV 服务器引擎告诉客户端某些操作不受支持,例如移动和复制文件。
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 标题中。正如塔拉斯在他的回答中建议的那样,只需在 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