问题
我正在尝试发布API以将数据发送到API,该API调用我的内部API服务以将该数据发送到其他API i服务.实体包含带文件的属性.这只将文件发送到另一个派生,但NameSender属性不随文件一起发送.
实体
public class Email
{
public string NameSender{ get; set; }
public List<IFormFile> Files { get; set; }
}
API
[Consumes("multipart/form-data")]
[HttpPost]
public IActionResult SendEmail([FromForm]Entity entity)
{
try
{
string Servicesfuri = this.serviceContext.CodePackageActivationContext.ApplicationName + "/" + this.configSettings.SendNotificationServiceName;
string proxyUrl = $"http://localhost:{this.configSettings.ReverseProxyPort}/{Servicesfuri.Replace("fabric:/","")}/api/values/Send";
//attachments
var requestContent = new MultipartFormDataContent();
foreach (var item in entity.Files)
{
StreamContent streamContent = new StreamContent(item.OpenReadStream());
var fileContent = new ByteArrayContent(streamContent.ReadAsByteArrayAsync().Result);
requestContent.Add(fileContent,item.Name,item.FileName);
}
HttpResponseMessage response = this.httpClient.PostAsync(proxyUrl,requestContent).Result;
if (response.StatusCode != System.Net.HttpStatusCode.OK)
{
return this.StatusCode((int)response.StatusCode);
}
return this.Ok(response.Content.ReadAsstringAsync().Result);
}
catch (Exception e)
{
throw e;
}
}
解决方法
这种方法适合我.您可以使用表单数据和文件
public async Task<bool> Upload(FileUploadRequest model)
{
var httpclienthandler = new httpclienthandler()
{
Proxy = new WebProxy("proxyAddress","proxyPort")
{
Credentials = CredentialCache.DefaultCredentials
},PreAuthenticate = true,UseDefaultCredentials = true
};
var fileContent = new StreamContent(model.File.OpenReadStream())
{
Headers =
{
ContentLength = model.File.Length,ContentType = new MediaTypeHeaderValue(model.File.ContentType)
}
};
var formDataContent = new MultipartFormDataContent();
formDataContent.Add(fileContent,"File",model.File.FileName); // file
formDataContent.Add(new StringContent("Test Full Name"),"FullName"); // form input
using (var client = new HttpClient(handler: httpclienthandler,disposeHandler: true))
{
client.DefaultRequestHeaders.Add("Authorization","Bearer " + tokenString);
using (var res = await client.PostAsync("http://filestorageurl",formDataContent))
{
return res.IsSuccessstatusCode;
}
}
}