Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET WebApi:如何使用WebApi HttpClient执行文件上载的多部分post_C#_Asp.net_Asp.net Web Api_Dotnet Httpclient - Fatal编程技术网

C# ASP.NET WebApi:如何使用WebApi HttpClient执行文件上载的多部分post

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

我有一个WebApi服务处理从一个简单表单上传的内容,比如:

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