Невозможно извлечь приложение MTOM/XOP в C#

Я все еще не могу извлечь вложение MIME. Пожалуйста, проверьте ниже сообщение MIME. который мы получили от сервиса.

--MIMEBoundary_199ca6b7114b9acca5deb2047d25d5841d4afb7f68281379
Content-Type: application/xop+xml; charset=utf-8; type="text/xml"
Content-Transfer-Encoding: binary
Content-ID: <0.099ca6b7114b9acca5deb2047d25d5841d4afb7f68281379@apache.org>

<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><StateHeader xmlns="http://www.statemef.com/StateGatewayService"><MessageID>12345201704200009962</MessageID><RelatesTo>12345201704200009962</RelatesTo><Action>GetNewAcks</Action><Timestamp>2017-02-11T01:54:51.676-05:00</Timestamp><TestIndicator>T</TestIndicator></StateHeader></soapenv:Header><soapenv:Body><GetNewAcksResponse xmlns="http://www.statemef.com/StateGatewayService"><MoreAvailable>true</MoreAvailable><AcknowledgementListAttachmentMTOM><xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:299ca6b7114b9acca5deb2047d25d5841d4afb7f68281379@apache.org"></xop:Include></AcknowledgementListAttachmentMTOM></GetNewAcksResponse></soapenv:Body></soapenv:Envelope>
--MIMEBoundary_199ca6b7114b9acca5deb2047d25d5841d4afb7f68281379
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
Content-ID: <299ca6b7114b9acca5deb2047d25d5841d4afb7f68281379@apache.org>

3 ответа

Шаг 1: Получить полный поток MIME, т.е. Content-Type заголовок, который определяет boundary параметр, который будет MIMEBoundary_199ca6b7114b9acca5deb2047d25d5841d4afb7f68281379, Без этого вы СОЛЬ.

Если вы используете что-то вроде HttpWebRequestперейдите к шагу 2.

Шаг 2: Следуйте инструкциям в FAQ MimeKit:

Как бы я проанализировал multipart/form-data из веб-запроса HTTP?

Так как занятия нравятся HttpWebResponse позаботьтесь о разборе заголовков HTTP (который включает в себя Content-Type заголовок) и предлагает только поток контента для использования, MimeKit предоставляет способ справиться с этим, используя следующие два статических метода на MimeEntity:

public static MimeEntity Load (ParserOptions options, ContentType contentType, Stream content, CancellationToken cancellationToken = default (CancellationToken));

public static MimeEntity Load (ContentType contentType, Stream content, CancellationToken cancellationToken = default (CancellationToken));

Вот как вы можете использовать эти методы:

MimeEntity ParseMultipartFormData (HttpWebResponse response)
{
    var contentType = ContentType.Parse (response.ContentType);

    return MimeEntity.Load (contentType, response.GetResponseStream ());
}

Получив MimeEntity, вы можете преобразовать его в Multipart и перечислить вложенные файлы, сохранив содержимое в потоке следующим образом:

int i = 1;
foreach (var attachment in multipart.OfType<MimePart> ()) {
    string fileName = string.Format ("attachment.{0}.dat", i++);
    using (var stream = File.Create (fileName))
        attachment.ContentObject.DecodeTo (stream);
}

Вы можете взять анализатор проекта в Github. Компонент WebResponseDerializer может проанализировать многочастное мыльное сообщение.

1) Скопируйте xml-сообщение между тегом soap body на сайт xml2charp и возьмите опустошенный объект.

2) Возьмите ответный поток и позвоните, как показано ниже.

 Byte[] file = File.ReadAllBytes("..\\..\\Data\\ccc.xxx");
        Stream stream = new MemoryStream(file);
        WebResponseDerializer<SIGetImageResponse> deserilizer = new WebResponseDerializer<SIGetImageResponse>(stream);
        SIGetImageResponse ddd = deserilizer.GetData();
        foreach (var item in ddd.ResponseData.AttachmentDescriptor.Attachment)
        {
            String contentId = "<<" + item.ImageData.Include.Href + ">>";
            contentId = contentId.Replace("%40", "@").Replace("cid:", "");
            item.ImageData.Include.XopData = deserilizer.GetAttachment(contentId);
        }

Вопрос показывает только ответ тела. Чтобы разобрать его, вы должны добавить заголовок ответа.

Например, это должно выглядеть так:

MIME-Version: 1.0 
content-type: multipart/related; type="application/xop+xml";start="<http://tempuri.org/0>";boundary="MIMEBoundary_someuniqueID";start-info="text/xml"
Server: Microsoft-IIS/10.0 
X-Powered-By: ASP.NET 
Content-Length:24371900


--MIMEBoundary_someuniqueID
Content-Type: application/xop+xml; charset=utf-8; type="text/xml" Content-Transfer-Encoding: binary
Content-ID: <http://tempuri.org/0>

<soap:Envelope> 
    <someWrapperElt>
        <xop:Include href="cid:uri_of_content"></xop:Include>
    </someWrapperElt>
</soap:Envelope>
--MIMEBoundary_someuniqueID
Content-Type: application/octet-stream 
Content-Transfer-Encoding: binary 
Content-ID: <uri_of_content>

...start.b1n@ry-content-here-etc.fckZ8990832d...
--MIMEBoundary_someuniqueID--

Затем преобразуйте весь ответ в объект MemoryStream и используйте XmlDictionaryReader для его анализа.

XmlDictionaryReader mtomReader = XmlDictionaryReader.CreateMtomReader(ms, Encoding.UTF8, XmlDictionaryReaderQuotas.Max);

То есть теперь вы можете извлекать нужные значения из объекта mtomReader, включая вложение.

Другие вопросы по тегам