1
  1. 在某些自定义文档状态适用的情况下,如何强制以只读模式打开文件?例如,一个文档可以经历不同的阶段:创建、审查、批准。一旦它被批准,任何人都不能修改它。

  2. 如何通过适用于 .NET api 的 WebDAV 服务器引擎告诉客户端某些操作不受支持,例如移动和复制文件。

4

3 回答 3

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实现中修改文件。

于 2012-11-24T00:01:28.480 回答
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);
        }
    }
     ......
}

希望这会帮助你。

于 2012-11-14T18:54:51.107 回答
0

“我如何通过 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
于 2012-11-23T21:00:41.983 回答