使用 WebRequest c# 将 xml 数据作为 multipart/form-data 发送

问题描述

我正在向一个 API 发帖,该 API 似乎坚持将 XML 数据作为多部分/表单数据接收。 该请求适用于 SOAP UI。但是,在 c# 中失败。下面是基于https://technet.rapaport.com/Info/LotUpload/SampleCode/Full_Example.aspx

提交的代码
string url = string.Format("url");

string strTkn = "strTkn";

string hdrXml = string.Format("<?xml version=\"1.0\" ?>\n<importdata>\n --redacted-XML-- \n</importdata>");


WebRequest request = WebRequest.Create(url);
request.Headers.Add("Authorization","Bearer " + strTkn);

string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");

string formContentType = "multipart/form-data; boundary=" + boundary;
request.ContentType = formContentType;
request.Method = "POST";
Stream postDataStream = new System.IO.MemoryStream();


string fileHeaderTemplate = Environment.NewLine + "--" + boundary + Environment.NewLine +
"Content-disposition: form-data; name=\"xml\"; filename=\"request\"" +
Environment.NewLine + "Content-Type: text/xml" + Environment.NewLine + Environment.NewLine;

byte[] byteHdr = System.Text.Encoding.UTF8.GetBytes(fileHeaderTemplate);

byte[] byteEnd = System.Text.Encoding.UTF8.GetBytes("--" + boundary + "--");

byte[] byteArray = System.Text.UTF8Encoding.UTF8.GetBytes(hdrXml);

postDataStream.Write(byteHdr,byteHdr.Length);

postDataStream.Write(byteArray,byteArray.Length);

postDataStream.Write(byteEnd,byteEnd.Length);

postDataStream.Position = 0;

byte[] buffer = new byte[1024];

int bytesRead = 0;

request.ContentLength = postDataStream.Length;

Stream reqStream = request.GetRequestStream();

while ((bytesRead = postDataStream.Read(buffer,buffer.Length)) != 0)
{
reqStream.Write(buffer,bytesRead);
}

postDataStream.Close();

reqStream.Close();

StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream());

string Result = sr.ReadToEnd();

解决方法

MIME 附件以新行开头的两个破折号开头。见:https://docs.microsoft.com/en-us/previous-versions/office/developer/exchange-server-2010/aa563375(v=exchg.140)

你有一个以两个破折号开头的额外行

这是您的 MIME 附件

  1. byteHdr :

------------------------------8d90d21ca8659b4 内容配置:表单数据;名称="xml";文件名=“请求” 内容类型:text/xml

  1. 字节结束

------------------------------8d90d21ca8659b4--

  1. byteArray : 两个破折号下方不从新行开始。

     <?xml version="1.0" ?>
     <importdata>
      --redacted-XML-- 
     </importdata>