Senden eines Anhangs über SOAP HttpWebRequest

Ich versuche, einen Anhang über ein @ zu sendeHttpWebRequest in einer Konsolenanwendung. Nachdem ich ein paar Tage lang im Internet nach einer verständlichen Hilfe gesucht und gesucht hatte, kam ich auf eine meiner Meinung nach anständige Lösung vonDiese Seit

Während ich denke, dass ich alles richtig gemacht habe, erhalte ich die folgende Fehlermeldung:

Multipart-Stream wurde beendet, bevor eine Abschlussgrenze festgestellt wurde.

Fragen
Ich hoffe, dass ich bei der @ Hilfe / Anleitung bekommmultipart Fehler, den ich erhalte, sowie Unterstützung beim Anhängen des tatsächlichenbyte[] des XML-Dokuments.

Bedarf

Die Datendatei, die angehängt werden muss, ist eine XML-Datei, die ein @ sein solltMTOM Attachment. Um es @ zu machMtom, ich verstehe, dass ich sicher sein muss, dass diemessageEncoding Attribut des<binding> Element imapp.config sollte einen Wert von @ hab"Mtom" und dies wird als solches codiert.Basierend auf den Geschäftsanforderungen (von denen streng ist), muss ich das @ sendbyte[] der Datei, nicht nur der Inhalt selbst.

Web Request Method

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

Methode zum Senden einer Anfrage
Beyogen aufdieser Beitra von mir, ich glaube, ich komprimiere dieHttpWebRequest passend mitGZip.

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

Methode zum Schreiben der MIME-Informationen und des Anhangs an den Stream

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

Soap Body Snippet Element
Durch die NutzungFiddler, Ich kann sehen, wie die Anfrage tatsächlich aussieht. Mir scheint, dass der Anhang tatsächlich als XML an die Anfrage angehängt wird, anstatt (wie ich dachte) alsbyte[].

Nachdem sollte dies das @ sebyte[] des Anhangs. Derzeit wird das vollständige XML-Dokument angezeigt.

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

Antworten auf die Frage(0)

Ihre Antwort auf die Frage