C# ASP.NET WebApi:如何使用WebApi HttpClient执行文件上载的多部分post
我有一个WebApi服务处理从一个简单表单上传的内容,比如:C# ASP.NET WebApi:如何使用WebApi HttpClient执行文件上载的多部分post,c#,asp.net,asp.net-web-api,dotnet-httpclient,C#,Asp.net,Asp.net Web Api,Dotnet Httpclient,我有一个WebApi服务处理从一个简单表单上传的内容,比如: <form action="/api/workitems" enctype="multipart/form-data" method="post"> <input type="hidden" name="type" value="ExtractText" /> <input type="file" name="FileForUpload" />
<form action="/api/workitems" enctype="multipart/form-data" method="post">
<input type="hidden" name="type" value="ExtractText" />
<input type="file" name="FileForUpload" />
<input type="submit" value="Run test" />
</form>
但是,我不知道如何使用HttpClient API模拟同一篇文章。
FormUrlEncodedContent
位非常简单,但是如何将文件内容和名称添加到帖子中?您需要查找HttpContent
的各种子类
您可以创建多种形式的http内容,并向其中添加不同的部分。在本例中,您有一个字节数组内容和表单url,编码方式如下:
HttpClient c=newhttpclient();
var fileContent=newbytearraycontent(新字节[100]);
fileContent.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“附件”)
{
FileName=“myFilename.txt”
};
var formData=new FormUrlEncodedContent(new[]
{
新的KeyValuePair(“名称”、“阿里”),
新的KeyValuePair(“标题”、“ostad”)
});
MultipartContent内容=新的MultipartContent();
content.Add(formData);
content.Add(fileContent);
c、 PostAsync(myUrl、内容);
经过多次尝试和错误,以下是实际有效的代码:
using (var client = new HttpClient())
{
using (var content = new MultipartFormDataContent())
{
var values = new[]
{
new KeyValuePair<string, string>("Foo", "Bar"),
new KeyValuePair<string, string>("More", "Less"),
};
foreach (var keyValuePair in values)
{
content.Add(new StringContent(keyValuePair.Value), keyValuePair.Key);
}
var fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(fileName));
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "Foo.txt"
};
content.Add(fileContent);
var requestUri = "/api/action";
var result = client.PostAsync(requestUri, content).Result;
}
}
使用(var-client=new-HttpClient())
{
使用(var content=new MultipartFormDataContent())
{
var值=新[]
{
新的KeyValuePair(“Foo”、“Bar”),
新的KeyValuePair(“更多”、“更少”),
};
foreach(值中的var keyValuePair)
{
添加(新的StringContent(keyValuePair.Value)、keyValuePair.Key);
}
var fileContent=newbytearraycontent(System.IO.File.ReadAllBytes(fileName));
fileContent.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“附件”)
{
FileName=“Foo.txt”
};
content.Add(fileContent);
var requestUri=“/api/action”;
var result=client.PostAsync(requestUri,content.result);
}
}
谢谢@Michael Tepper的回答
我必须将附件发布到MailGun(电子邮件提供商),我必须稍微修改它,以便它接受我的附件
var fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(fileName));
fileContent.Headers.ContentDisposition =
new ContentDispositionHeaderValue("form-data") //<- 'form-data' instead of 'attachment'
{
Name = "attachment", // <- included line...
FileName = "Foo.txt",
};
multipartFormDataContent.Add(fileContent);
var fileContent=newbytearraycontent(System.IO.File.ReadAllBytes(fileName));
fileContent.Headers.ContentDisposition=
新的ContentDispositionHeaderValue(“表单数据”)//不幸的是,这不起作用,尽管ContentDisposition
标题似乎让我向前迈进了一步。如果按原样使用示例代码,则会出现不支持的媒体类型
异常。但是,如果我用MultipartFormDataContent
替换MultipartContent
,异常就会消失。但是,在服务器上,隐藏字段的值丢失。@MichaelTeper我没有测试代码。我会玩一下并更新帖子,但我的重点是向您展示一段您需要查找的内容,而不是一段正常工作的代码。我只得到了StatusCode:415,原因短语:“不支持的媒体类型”
对大文件使用StreamContent:var fileContent=newstreamcontent(File.OpenRead(fileName));我有一个完全不同的问题,但仍然需要发布内容。我可以修改以适应我的需要。谢谢!!奇怪的是,这对我不起作用。我必须在内容名称周围添加引号,请参见:仅供参考,System.Net.Mime.dispositionTypeNames下的“附件”有一个常量我也必须在名称值周围添加引号:FileName=“\”TestImage.jpg\”。我在服务器上使用ServiceStack而不是WebAPI不确定这是否相关。您介意在使用MultipartFormDataContent的WebAPI端共享代码吗?答案中的示例将参数作为multipeart dotnet 3.0发送
var fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(fileName));
fileContent.Headers.ContentDisposition =
new ContentDispositionHeaderValue("form-data") //<- 'form-data' instead of 'attachment'
{
Name = "attachment", // <- included line...
FileName = "Foo.txt",
};
multipartFormDataContent.Add(fileContent);