如果某个自定义文档状态适用,如何强制以只读模式打开文件?例如,文档可以经历各个阶段:创建,审阅和批准。一旦获得批准,没有人可以修改它。
如何通过WebDAV Server Engine for .NET API告知客户端不支持某些操作,例如移动和复制文件。
答案 0 :(得分:1)
“如何强制以只读模式打开文件......”
如果您使用的是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实施中的文件。
答案 1 :(得分:0)
如果您想在所有情况下禁止复制和移动操作,请执行以下操作:
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);
}
}
......
}
希望这会对你有所帮助。
答案 2 :(得分:0)
“如何通过WebDAV Server Engine for .NET api告诉客户端 某些操作不受支持,例如移动和 复制文件。“
假设您可以从为响应OPTIONS请求而返回的Allow和Public标题中删除删除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