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