Пользовательский клиент Sharepoint. Прочитать документ Word через MS-FSSHTTP
Я работаю над случаем, когда компания использует прокси-сервер веб-службы для всех обменов данными с использованием веб-служб, чтобы контролировать данные и процессы, которыми обмениваются внешние партнеры.
Когда партнер хочет открыть документ в Word, прокси-сервер перехватывает вызов веб-службы Sharepoint (celltorage.svc/CellStorageService). Это вызов MS-FSSHTTP.
Ответ, возвращаемый сервером sharepoint, имеет тип multipart/ related, application / xop + xml.
Это документ MIME, содержащий мыльный ответ в одной части (text/ xml) и содержимое документа в другой MIME (application/octet-stream).
Посредством ответа отклика мы можем получить двоичный контент, распаковать двоичные данные, но не можем прочитать документ word.
Если содержимое SOAP-сообщения очень хорошо описано в документации MS, в бинарной части ничего нет.
Нам удалось прочитать его, но не удалось открыть слово документа. Мы получаем исключение, сообщающее, что содержимое недействительно. Что основная часть отсутствует. Позвольте нам задаться вопросом, действительно ли это документ OpenXML, который мы получаем.
Я хотел бы знать, есть ли у вас какие-либо идеи о том, из чего сделан бинарный контент?
Тип контента:
Content-Type: multipart/related; type="application/xop+xml"; boundary="urn:uuid:a192024b-547a-584b-a56c-b05f25c22fdf"; start="<1c830af4-214f-1c4b-8a71-6269053e3161@tempuri.org>"; start-Info="text/xml; charset=utf-8"
Возвращаемый контент:
--uuid:acf0b1de-4e59-4304-ba6e-23a7a4e2a9cc+id=1
Content-ID: <http://tempuri.org/0>
Content-Transfer-Encoding: 8bit
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body>
<ResponseVersion Version="2" MinorVersion="3"
xmlns="http://schemas.microsoft.com/sharepoint/soap/"/><ResponseCollection
WebUrl="
...
></SubResponse></Response></ResponseCollection></s:Body></s:Envelope>
--uuid:acf0b1de-4e59-4304-ba6e-23a7a4e2a9cc+id=1
Content-ID: <http://tempuri.org/1/636403683925268534>
Content-Transfer-Encoding: binary
Content-Type: application/octet-stream
... here comes the binary
Мы пытаемся прочитать содержание документа word следующим образом:
if (url.Contains("CellStorageService"))
{
MemoryStream ms = new MemoryStream(bytes);
string headerResponse = "MIME-Version: 1.0\r\n" + contentType + "\r\n";;
string full = headerResponse + content + txt;
byte[] fullBytes = System.Text.Encoding.UTF8.GetBytes(full);
// Read the mime message
MimeMessage message = MimeMessage.Load(new MemoryStream(fullBytes));
var iter = new MimeIterator(message);
while (iter.MoveNext())
{
var multipart = iter.Parent as Multipart;
var part = iter.Current as MimePart;
if (part != null)
{
ContentType contentType = part.ContentType;
if (contentType.ToString().Contains("application/octet-stream"))
{
using (var memory = new MemoryStream())
{
part.ContentObject.WriteTo(memory);
// Content is compressed
MemoryStream decompressedStream = new MemoryStream();
using (GZipStream decompressionStream = new GZipStream(memory, CompressionMode.Decompress))
{
decompressionStream.CopyTo(decompressedStream);
Console.WriteLine("Decompressed");
}
// Here we get the exception: DocumentFormat.OpenXml.Packaging.OpenXmlPackageException: The specified package is invalid. The main part is missing
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(decompressedStream, true))
{
var body = wordDoc.MainDocumentPart.Document.Body;
foreach (var text in body.Descendants<DocumentFormat.OpenXml.Wordprocessing.Text>())
{
parseText(text.Text);
onAudit(text.Text);
}
}
}
}
}
}
Трассировка стека
DocumentFormat.OpenXml.Packaging.OpenXmlPackageException was unhandled by user code
HResult=-2146233088
Message=The specified package is invalid. The main part is missing.
Source=DocumentFormat.OpenXml
StackTrace:
à DocumentFormat.OpenXml.Packaging.OpenXmlPackage.Load()
à DocumentFormat.OpenXml.Packaging.OpenXmlPackage.OpenCore(Stream stream, Boolean readWriteMode)
à DocumentFormat.OpenXml.Packaging.WordprocessingDocument.Open(Stream stream, Boolean isEditable, OpenSettings openSettings)
à DocumentFormat.OpenXml.Packaging.WordprocessingDocument.Open(Stream stream, Boolean isEditable)
InnerException:
У вас есть представление о бинарном контенте? И как мне получить доступ к docx?
Большое спасибо
жилль