1

tl;博士

您是否需要实现Microsoft WebDav 扩展属性才能正确使用 Word。

扩展问题

我正在预先存在的WebDAV.NET 开源项目之上构建一个 WebDav 服务器。我注意到,对于 Word 2010(没有尝试其他版本),他们的示例代码无法正确处理保存 Microsoft Word 文档,因为即使文档正确保存并且您是该文件的唯一用户,它也会显示“上传失败”。我试图找出原因,引起我注意的一件事是Microsoft WebDav Extension Properties。对此的 MS 页面声明“实现 WebDAV 协议的 WebDAV 服务器:Microsoft 扩展应该实现以下扩展属性。” 既然它声明应该,我假设你不必支持它来使用 Word。

当我注意到我的 propfind 请求/响应如下所示时,我开始怀疑这些扩展:

PROPFIND /test123.docx HTTP/1.1
Cache-Control: no-cache
Connection: Keep-Alive
Pragma: no-cache
Content-Type: text/xml; charset="utf-8"
User-Agent: Microsoft Office Core Storage Infrastructure/1.0
Depth: 0
Translate: f
Connection: Keep-Alive
Content-Length: 208
Host: localhost:62954

<?xml version="1.0" encoding="utf-8" ?><D:propfind xmlns:D="DAV:" xmlns:Office="urn:schemas-microsoft-com:office:office"><D:prop><D:creationdate/><D:getlastmodified/><Office:modifiedby/></D:prop></D:propfind>

HTTP/1.1 207 Multi-Status
Server: ASP.NET Development Server/10.0.0.0
Date: Mon, 16 Apr 2012 14:11:55 GMT
X-AspNet-Version: 4.0.30319
MS-Author-Via: DAV
Cache-Control: private
Content-Type: text/xml; charset=utf-8
Content-Length: 576
Connection: Close

<?xml version="1.0" encoding="utf-8"?>
<D:multistatus xmlns:D="DAV:">
    <D:response>
        <D:href>http://localhost:62954/test123.docx</D:href>
        <D:propstat>
            <D:prop>
                <D:creationdate>2012-04-10T08:00:00Z</D:creationdate>
                <D:getlastmodified>2012-04-16T09:09:44Z</D:getlastmodified>
            </D:prop>
            <D:status>HTTP/1.1 200 OK</D:status>
        </D:propstat>
        <D:propstat>
            <D:status>HTTP/1.1 404 Not Found</D:status>
            <D:prop>
                <modifiedby xmlns="urn:schemas-microsoft-com:office:office" />
            </D:prop>
        </D:propstat>
    </D:response>
</D:multistatus>

如果有人好奇,以下是我的 PUT 回复。

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Mon, 16 Apr 2012 14:18:06 GMT
X-AspNet-Version: 4.0.30319
MS-Author-Via: DAV
Cache-Control: private
Content-Length: 0
Connection: Close
4

2 回答 2

2

顺便说一句,我在 Sphorium webdav 中发现了导致此问题的错误。该错误出现在方法DavLockBase_InternalProcessDavRequest()中,错误的代码行是:

string[] _lockTokens = this.RequestLock.GetLockTokens();

应该是:

string[] _lockTokens = this.ResponseLock.GetLockTokens();
于 2012-09-17T19:15:18.000 回答
1

不,您不需要实现Microsoft WebDAV Extension Properties (我想出了自己问题的答案)

WebDAV.NET 的问题在于其中存在一个错误,即标头中的空 LockToken 会混淆 Word 并使其无法将 LockToken 提供给 PUT 请求。

于 2012-04-16T18:56:50.930 回答