Отправка вложения через SOAP HttpWebRequest

Я пытаюсь отправить вложение черезHttpWebRequest в консольном приложении. После нескольких дней поиска и поиска в интернете некоторой понятной помощи в этом, я нашел то, что я думаю, является достойным решением отэтот сайт

Хотя я думаю, что все сделал правильно, я получаю следующую ошибку:

Составной поток завершился до того, как была обнаружена завершающая граница.

Вопросы:
Я надеюсь получить некоторую помощь / руководство сmultipart ошибка, которую я получаю, а также помощь в прикреплении фактическогоbyte[] документа XML.

Требования:

Файл данных, который необходимо прикрепить, представляет собой файл XML, который должен бытьMTOM Attachment, Для того, чтобы сделать этоMtomНасколько я понимаю, я должен быть уверен, чтоmessageEncoding атрибут<binding> элемент вapp.config должен иметь значение"Mtom" и это будет закодировано как таковое.Исходя из бизнес-требований (из которых является строгим), мне нужно отправитьbyte[] файла, а не просто самого содержимого.

Метод веб-запроса

private static HttpWebRequest CreateWebRequest(SoapAction action)
{
    // Retrieve URL from Endpoint in the app.Config based on the action passed into the
    // method.
    string url = GetUrlAddress(action);

    if (url != null)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

        request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
        request.Headers.Add(HttpRequestHeader.ContentEncoding, "gzip");
        request.Headers.Add("Content-Transfer-Encoding", "8bit");
        request.Headers.Add("SOAPAction", action.ToString());

        request.Method = "POST";

        request.Headers.Add("MIME-Version", "1.0");
        request.ContentType = "multipart/form-data; type=\"application/xop+xml;\" boundary=\"" + BoundaryMarker + "\"";

        request.ClientCertificates.Add(SecurityCertificate.CertificateObject);

        ServicePointManager.Expect100Continue = false;

        return request;
    }
    else
    {
        throw new NullReferenceException("Address for Endpoint could not be resolved.");
    }
}

Способ отправки запроса
На основеэта почта я считаю, что я сжимаюHttpWebRequest соответственно используяGZip.

private static void SubmitRequest(HttpWebRequest request, XDocument soapXml, byte[] formXmlBytes, FileInfo fileToUpload)
{
    using (Stream requestStream = request.GetRequestStream())
    {
        using (GZipStream gz = new GZipStream(requestStream, CompressionMode.Compress, false))
        {
            soapXml.Save(gz);
            WriteToStream(gz, formXmlBytes, fileToUpload.Name);
        }
    }
}

Метод, используемый для записи информации MIME и вложения в поток

public static void WriteToStream(Stream stream, byte[] formData, string fileName)
    {
        // Write a new line to the stream.
        byte[] newLineBytes = Encoding.UTF8.GetBytes("\r\n");
        stream.Write(newLineBytes, 0, newLineBytes.Length);

        // Write the header to the stream.
        string header = String.Format(HeaderTemplate, BoundaryMarker, fileName, RequestContentID);
        byte[] headerBytes = Encoding.UTF8.GetBytes(header);
        stream.Write(headerBytes, 0, headerBytes.Length);

        // Write a new line to the stream.
        stream.Write(newLineBytes, 0, newLineBytes.Length);

        // Write the formData to the stream.
        stream.Write(formData, 0, formData.Length);

        // Write a new line to the stream.
        stream.Write(newLineBytes, 0, newLineBytes.Length);

        // Write the footer to the stream.
        byte[] boundaryFooterBytes = Encoding.UTF8.GetBytes("--" + BoundaryMarker + "--");
        stream.Write(boundaryFooterBytes, 0, boundaryFooterBytes.Length);
    }

Элемент фрагмента тела мыла
ИспользуяFiddlerЯ могу видеть, как на самом деле выглядит запрос. Мне кажется, что вложение на самом деле добавляется к запросу как XML, а не (как я думал, будет)byte[].

После этого должно бытьbyte[] вложения. В настоящее время отображается полный XML-документ.

Accept-Encoding: gzip, deflate
Content-Transfer-Encoding: 8bit
MIME-Version: 1.0
Content-Type: multipart/form-data; type="application/xop+xml;" boundary="--b73acdd180274cab985e4d697bfde428"
Content-Length: 582081
Connection: Keep-Alive

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="..." ...>
...
<soapenv:Body>
    <urn:Request version="1.0">
        <urn:FileAttachment>cid:b73acdd180274cab985e4d697bfde428</urn:FileAttachment>
    </urn:Request>
</soapenv:Body>
</soapenv:Envelope>
----b73acdd180274cab985e4d697bfde428
Content-Disposition: attachment; filename="test.xml"
Content-Type: text/xml
Content-Id: b73acdd180274cab985e4d697bfde428
<XML OF ATTACHMENT>
----b73acdd180274cab985e4d697bfde428--

Ответы на вопрос(0)

Ваш ответ на вопрос