HttpClient Post REST API中的C#多部分表单数据

HttpClient Post REST API中的C#多部分表单数据,c#,rest,asp.net-core,advanced-rest-client,C#,Rest,Asp.net Core,Advanced Rest Client,下面是邮递员的密码。我需要在POST请求中发送此正文和标题 var client = new RestClient("https://azr-stg.dev03.abs.ase.southcentralus.us.wc.net/files/v11"); var request = new RestRequest(Method.POST); request.AddHeader("cache-control", "no-cache"); request.AddHeader("Content-Type

下面是邮递员的密码。我需要在POST请求中发送此正文和标题

var client = new RestClient("https://azr-stg.dev03.abs.ase.southcentralus.us.wc.net/files/v11");
var request = new RestRequest(Method.POST);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("Content-Type", "application/pdf");
request.AddHeader("X-Client-Id", "94437320-3bcf-498d-915a");
request.AddHeader("Tenant-Id", "0d3ad0cd-3bb3-4fc0-bd15");
request.AddHeader("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA");
request.AddParameter("multipart/form-data; boundary=----WebKitFormBoundary7MA", "------WebKitFormBoundary7MA\r\nContent-Disposition: form-data; name=\"file\"; filename=\"sample.pdf\"\r\nContent-Type: application/pdf\r\n\r\n\r\n------WebKitFormBoundary7MA\r\nContent-Disposition: form-data; name=\"metadata\"\r\n\r\n\r\n------WebKitFormBoundary7MA--", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);

上面的文章在Postman中运行良好,能够上传文件,但我希望以编程方式完成这项工作。 API接受内容类型(如文本、pdf、图像文件)

如何格式化正文和标题内容,以便使用多部分表单数据通过HttpClient请求发送上述内容

这里是我使用HttpClient示例代码的地方。我收到错误的请求/内部服务器错误。

HttpClient _httpclient = new HttpClient()
using (var multiPartStream = new MultipartFormDataContent())
{



MemoryStream stream = new MemoryStream(filecontent);
//JsonSerializer.WriteObject(stream, newDocument);
ByteArrayContent firstPart = new ByteArrayContent(stream.ToArray());
firstPart.Headers.ContentType = JSON_GENERIC_MEDIA_TYPE;
firstPart.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "metadata" };
multiPartStream.Add(firstPart);
stream.Dispose();


StreamContent otherContent = new StreamContent(content);
otherContent.Headers.ContentType = new MediaTypeHeaderValue(applicationContentType);
//otherContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "file" };
otherContent.Headers.Add("Content-Disposition", $"form-data; name=\"file\"; filename=\"{docFullName}\"");

multiPartStream.Add(otherContent);


HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, urlTwo);
request.Content = multiPartStream;


 request.Headers.Accept.Add(“application/json”);
 request.Headers.Add("X-Client-Id", "94437320-3bcf-498d-915a");
 request.Headers.Add("Tenant-Id", "0d3ad0cd-3bb3-4fc0-bd15");
 HttpCompletionOption option = HttpCompletionOption.ResponseContentRead;

using (HttpResponseMessage response = _httpClient.SendAsync(request, option).Result)
{

if (response.IsSuccessStatusCode)
{
  var deserializedObject = JsonConvert.DeserializeObject<Walmart.MDM.MasterUIMVC.Helpers1.RootObject>(response.Content.ReadAsStringAsync().Result);
  return deserializedObject.properties.r_object_id.ToString();
}

HttpClient\u HttpClient=new HttpClient()
使用(var multiPartStream=new MultipartFormDataContent())
{
MemoryStream stream=新的MemoryStream(filecontent);
//JsonSerializer.WriteObject(流,newDocument);
ByteArrayContent第一部分=新的ByteArrayContent(stream.ToArray());
firstPart.Headers.ContentType=JSON\u GENERIC\u MEDIA\u TYPE;
firstPart.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“表单数据”){Name=“metadata”};
multiPartStream.Add(第一部分);
stream.Dispose();
StreamContent otherContent=新的StreamContent(内容);
otherContent.Headers.ContentType=新的MediaTypeHeaderValue(applicationContentType);
//otherContent.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“表单数据”){Name=“file”};
添加(“内容处置”,$“表单数据;名称=\“文件\”;文件名=\“{docFullName}\”);
multiPartStream.Add(其他内容);
HttpRequestMessage请求=新的HttpRequestMessage(HttpMethod.Post,urlTwo);
request.Content=multiPartStream;
request.Headers.Accept.Add(“application/json”);
请求。标题。添加(“X-Client-Id”、“94437320-3bcf-498d-915a”);
添加(“租户Id”、“0d3ad0cd-3bb3-4fc0-bd15”);
HttpCompletionOption=HttpCompletionOption.ResponseContentRead;
使用(HttpResponseMessageResponse=\u httpClient.SendAsync(请求,选项).Result)
{
if(响应。IsSuccessStatusCode)
{
var deserializedObject=JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result);
返回反序列化的object.properties.r_object_id.ToString();
}

非常感谢您的帮助。

总而言之,我终于能够以编程方式用C#再现Postman代码了

我能够在多部分表单数据中添加“metadata”属性

参考:

string Seshat\u URL=”https://azr-stg.dev03.abs.ase.southcentralus.us.wc.net/files/v11";
使用(var multiPartStream=new MultipartFormDataContent())
{
Add(newstringcontent(“{}”),“metadata”);
multiPartStream.Add(新的ByteArrayContent(filecontent,0,filecontent.Length),“file”,docName);
HttpRequestMessage请求=新的HttpRequestMessage(HttpMethod.Post,Seshat_URL);
request.Content=multiPartStream;
//“应用程序/json”-内容类型
request.Headers.Accept.Add(JSON\u GENERIC\u MEDIA\u TYPE);
添加(“X-Client-Id”,ClientId);
request.Headers.Add(“租户Id”,租户Id);
HttpCompletionOption=HttpCompletionOption.ResponseContentRead;
System.Net.ServicePointManager.ServerCertificateValidationCallback=((发送方、证书、链、sslPolicyErrors)=>true);
使用(HttpResponseMessageResponse=\u httpClient.SendAsync(请求,选项).Result)
{
if(响应。IsSuccessStatusCode)
{
var deserializedObject=JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result);
返回反序列化对象.fileId.ToString();
}                        
}
}//结束尝试
string Seshat_URL = "https://azr-stg.dev03.abs.ase.southcentralus.us.wc.net/files/v11";
      using (var multiPartStream = new MultipartFormDataContent())
                {

                    multiPartStream.Add(new StringContent("{}"), "metadata");
                    multiPartStream.Add(new ByteArrayContent(filecontent, 0, filecontent.Length), "file", docName);
                    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, Seshat_URL);
                    request.Content = multiPartStream;
                    //"application/json" - content type
                    request.Headers.Accept.Add(JSON_GENERIC_MEDIA_TYPE);  
                    request.Headers.Add("X-Client-Id", ClientId);                
                    request.Headers.Add("Tenant-Id", TenantId);

                    HttpCompletionOption option = HttpCompletionOption.ResponseContentRead;
                    System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);

                    using (HttpResponseMessage response = _httpClient.SendAsync(request, option).Result)
                    {
                        if (response.IsSuccessStatusCode)
                        {
                            var deserializedObject = JsonConvert.DeserializeObject<Wc.MCM.UIMVC.Helpers1.BlobResponse>(response.Content.ReadAsStringAsync().Result);
                            return deserializedObject.fileId.ToString();
                        }                        
                    }

                }//End Try