我正在尝试为Office Web Apps实现MS-FSSHTTP。具体来说,我只需要让 Word 工作。
OWA 服务器正在发送一个ExecuteCellStorageRequest请求,该请求遵循 FSSHTTP 标准(看起来像被屠杀的 SOAP)。
请求正文是没有信封的标准 SOAP 请求。它看起来像这样(为清楚起见而格式化):
<RequestVersion Version="2" MinorVersion="2" xmlns="http://schemas.microsoft.com/sharepoint/soap/"/>
<RequestCollection CorrelationId="4528ff55-db57-402f-894a-fcd23cb569c3" xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<Request RequestToken="0" Build="15.0.4481.1000" UserAgentClient="msword" UserAgentPlatform="wac" MetaData="99">
<SubRequest SubRequestToken="1" Type="Cell">
<SubRequestData BinaryDataSize="197" PartitionID="bbd4e3c0-21b4-463d-9279-9c5a9406aa8f">
DAALAJzPKfM5lAabBgIAAO4CAABaBBYADW1zd29yZAd3YWN6AggAFRihD3cBFgIGAAUFABoEIADA49S7tCE9RpJ5nFqUBqqPigICAAk+AgQAAQAfAT4CBAACALoCAgAVHwE+AgQABwECA1QAA1G5+t6Eo6oNSqOoUgx3rHBzAQAAAADqbeOQaI5Gpm3DzbeeY5MBAAAAHwE+AgQABwECAywAAikwtZ5NpE1DT7hZsxzAcAZlAQAAAB8BhABBCwGsAgBVAwE=
</SubRequestData>
</SubRequest>
</Request>
</RequestCollection>
我将此请求包装在标准的 SOAP 信封中,
$wrap_req = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body>'.$req.'</SOAP-ENV:Body></SOAP-ENV:Envelope>';
这样我就可以将它传递给内置的 PHP SoapServer类(以免它崩溃而没有错误消息)。
处理时它会为我调用一个RequestVersion
方法(我认为这是正确的;我无法确定该二进制消息的正面或反面)并产生响应。[它只是获取标签名称并以相同的名称调用函数。我认为这根本不是它所要求的。]
响应也应该是无信封的,所以我把它去掉,
$doc = new DOMDocument();
$doc->loadXML($resp);
$resp_body = $doc->saveXML($doc->firstChild->firstChild->firstChild->firstChild);
并寄回。看起来像这样:
<ResponseVersion xmlns="http://schemas.microsoft.com/sharepoint/soap/" Version="2" MinorVersion="0"/>
(我认为这是它正在寻找的响应,通过查看这个模式)。
请求标头还说它Expect
是 sa 100-continue
,因此我将 HTTP 100 状态代码连同我的响应一起发回。
我只能假设 OWA 服务器不喜欢我的响应,因为它会立即关闭我的连接,
2014/01/23 14:08:31 [info] 81976#0: *229 kevent() 报告客户端 192.168.0.10 关闭了 keepalive 连接
现在我很难过。
OWA 服务器没有给我任何类型的错误消息,所以我不知道可能出了什么问题或如何获取更多信息。我可以远程访问 OWA 机器,但在日志中看不到任何有用的信息。
有没有人有任何实现 MS-FSSHTTP 的经验(我的谷歌搜索表明一个响亮的“不”)或者知道如何进一步调试这个?我相信 OWA 只是一个在 IIS 上运行的 ASP.NET 应用程序,但 AFAICT 所有的源代码都是预编译的二进制文件。