Enviar un archivo adjunto a través de SOAP HttpWebRequest

Estoy intentando enviar un archivo adjunto a través de unHttpWebRequest en una aplicación de consola. Después de unos días de buscar y buscar en Internet alguna ayuda comprensible sobre esto, se me ocurrió lo que creo que es una solución decente deeste sitio

Si bien creo que hice todo correctamente, recibo el siguiente error:

La secuencia de varias partes finalizó antes de encontrar un límite de terminación.

Preguntas:
Espero obtener ayuda / orientación con elmultipart error que recibo, así como asistencia para adjuntar el actualbyte[] del documento XML.

Requisitos:

El archivo de datos que debe adjuntarse es un archivo XML que debe ser unMTOM Attachment. Para hacerloMtom, entiendo que necesito asegurarme de quemessageEncoding atributo de la<binding> elemento en elapp.config debe tener un valor de"Mtom" y esto se codificará como tal.Según los requisitos comerciales (de los cuales es estricto), necesito enviar elbyte[] del archivo, no simplemente los contenidos en sí.

Método de solicitud web

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.");
    }
}

Método para enviar solicitud
Residencia enesta publicación mía, creo que estoy comprimiendo elHttpWebRequest usando apropiadamenteGZip.

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);
        }
    }
}

Método utilizado para escribir la información MIME y el archivo adjunto a la secuencia

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);
    }

Elemento de fragmento de cuerpo de jabón
Mediante el usoFiddler, Puedo ver cómo se ve realmente la solicitud. Para mí, parece que el archivo adjunto se está agregando a la solicitud como el XML que es, en lugar de (lo que pensé que sería) unbyte[].

Después de esto debería ser elbyte[] del archivo adjunto. Actualmente, se muestra el documento XML completo.

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--

Respuestas a la pregunta(0)

Su respuesta a la pregunta