C# 使用Web API读取HTTP文件和表单数据而不写入磁盘

C# 使用Web API读取HTTP文件和表单数据而不写入磁盘,c#,asp.net-web-api,http-headers,C#,Asp.net Web Api,Http Headers,我的问题与此类似: 然而,这个问题和大多数其他类似的问题都停留在读取文件数据上。我已使该位工作正常,但我还希望读取表单中的其他表单数据,该表单包含其他上传元素,如“标题”等。这来自上述问题中的解决方案: var filesToReadProvider = await Request.Content.ReadAsMultipartAsync(); FileStoredProvider是HTTPContent对象的集合,因此我尝试: List<Htt

我的问题与此类似:

然而,这个问题和大多数其他类似的问题都停留在读取文件数据上。我已使该位工作正常,但我还希望读取表单中的其他表单数据,该表单包含其他上传元素,如“标题”等。这来自上述问题中的解决方案:

            var filesToReadProvider = await Request.Content.ReadAsMultipartAsync();
FileStoredProvider是HTTPContent对象的集合,因此我尝试:

        List<HttpContent> uploadedstuff = filesToReadProvider.Contents.ToList();
        Image image = new Image(); ;        // The image object we will create
        Stream filestream;  // The file stream object to use with the image
        foreach (var thing in uploadedstuff)
        {
            try
            {
                string name = thing.Headers.ContentDisposition.Name.Replace("\"", ""); // String is quoted "\""namestring"\"" so need it stripped out
                List<NameValueHeaderValue> parameters = thing.Headers.ContentDisposition.Parameters.ToList();
                if (name == "file")
                {
                    image.LocalFileName = thing.Headers.ContentDisposition.FileName;
                    filestream = await thing.ReadAsStreamAsync();
                }
                if (name == "Title")
                {
                    // vvv- this line causes an exception.
                    NameValueCollection titleData = await thing.ReadAsFormDataAsync();
                }
            }
            catch (System.Exception e)
            {
                var message = "Something went wrong";
                HttpResponseMessage err = new HttpResponseMessage() { StatusCode = HttpStatusCode.ExpectationFailed, ReasonPhrase = message };
                return ResponseMessage(err);
            }
        }
List uploadedstuff=filesToReadProvider.Contents.ToList();
图像图像=新图像();;//我们将创建的图像对象
流文件流;//要与图像一起使用的文件流对象
foreach(uploadedstuff中的变量)
{
尝试
{
string name=thing.Headers.ContentDisposition.name.Replace(“\”,”);//字符串被引用为“\”namestring“\”,所以需要去掉它
List parameters=thing.Headers.ContentDisposition.parameters.ToList();
如果(名称=“文件”)
{
image.LocalFileName=thing.Headers.ContentDisposition.FileName;
filestream=wait thing.ReadAsStreamAsync();
}
如果(名称=“标题”)
{
//vvv-该行导致异常。
NameValueCollection titleData=Wait thing.ReadAsFormDataAsync();
}
}
捕获(System.e例外)
{
var message=“出了问题”;
HttpResponseMessage err=new HttpResponseMessage(){StatusCode=HttpStatusCode.ExpectationFailed,ReasonPhase=message};
返回响应消息(err);
}
}
你知道我应该做些什么来获取例如“标题”表格数据吗?我觉得我很接近,但可能采取了错误的方法?
非常感谢。

现在在评论中已经整理好了,我将发布这个答案以帮助其他人

表单多部分内容将数据发送回服务器,如下所示“

然后,您将创建一个控制器和操作,如下所示:

public class MainController : Controller
{
    [HttpPost]
    public async Task<IActionResult> UploadImage([FromForm]Model model)
    {
        var files = Request.Files;
        var title = model.Title
        //And you can save or use files and content at the same time.
    }
}
公共类主控制器:控制器
{
[HttpPost]
公共异步任务上载映像([FromForm]模型)
{
var files=Request.files;
var title=model.title
//您可以同时保存或使用文件和内容。
}
}
这通常是MVC场景中要做的,如果在客户端使用Razor或Pages,甚至不需要指定[FromForm]属性

我希望这对你有帮助


免责声明。我已经在浏览器中写下了所有这些。可能包含语法和其他错误。

表单多部分内容的每个部分都有自己的内容类型。尝试
thing.ReadAsStringAsync()
并查看返回的内容。如果这是我认为精彩的,我会详细阐述,谢谢你!。。。是的,就是这样。我觉得我离得很近,这就够了。很好。再次感谢@Emad。。。所以我想问你一个小问题,因为理想情况下,我希望有一个API签名,比如:public async Task UploadImage(ImageFile,ImageDTO image)。。。你是说我可以通过在签名中添加[Fromform]更自动地完成这项工作吗。。与[FromBody]的方式相同?如果是这样的话,那就简单多了。我放弃了这种方法,因为我找不到任何有希望的文档来描述它是如何实现的。我预测这将成为一篇博览群书的帖子。我会试一试,所以如果我再次回来,请原谅我。谢谢,请看编辑。我已经尽力解释了。嗨,Emad,我只是想说我今天早上试过了,但没法用。这有点像我开始的地方,但我注意到没有提供[FromForm],我想您一定是指.NETCore中的一个工具。我目前的目标是.NET4.6,准备很快迁移到Core3,但这是我以后需要解决的另一个问题。。现在,我将回到我的工作解决方案,也许再次看看Core 3。再次感谢。这在.Net framework中是不同的。我有点忘了那是怎么回事,否则我会编辑答案,把它包括进去。据我记忆所及。您需要有一个对象,该对象具有在每个零件中发送的确切属性。请测试这个,如果它工作告诉我编辑
public class Model
{
    public string Title { get; set; }
}
public class MainController : Controller
{
    [HttpPost]
    public async Task<IActionResult> UploadImage([FromForm]Model model)
    {
        var files = Request.Files;
        var title = model.Title
        //And you can save or use files and content at the same time.
    }
}