C# 将内容从多部分文件上载读取到内存

C# 将内容从多部分文件上载读取到内存,c#,wcf-web-api,C#,Wcf Web Api,我在将上传的XML文件读取到字符串而不是文件时遇到问题 我的问题是,当我尝试访问流(var stream=part.ContentReadStream)时,它就关闭了。我感觉它正在访问关闭的文件流。我是否错误地使用MultipartFormDataStreamProvider?文件大小只有几千字节,所以这应该不是问题 [WebInvoke(Method = "POST", UriTemplate = "{importFile}")] public HttpResponseMess

我在将上传的XML文件读取到字符串而不是文件时遇到问题

我的问题是,当我尝试访问流(
var stream=part.ContentReadStream
)时,它就关闭了。我感觉它正在访问关闭的文件流。我是否错误地使用MultipartFormDataStreamProvider?文件大小只有几千字节,所以这应该不是问题

    [WebInvoke(Method = "POST", UriTemplate = "{importFile}")]
    public HttpResponseMessage Upload(string importFile, HttpRequestMessage request)
    {
        if (!request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

        // Create a stream provider for setting up output streams
        MultipartFormDataStreamProvider streamProvider = new MultipartFormDataStreamProvider();

        // Read the MIME multipart content using the stream provider we just created.
        var task = request.Content.ReadAsMultipartAsync(streamProvider);
        task.Wait();
        IEnumerable<HttpContent> bodyparts = task.Result;
        string submitter;
        if (!bodyparts.TryGetFormFieldValue("submitter", out submitter))
        {
            submitter = "unknown";
        }

        // Get list of local file names from stream provider
        IDictionary<string, string> bodyPartFileNames = streamProvider.BodyPartFileNames;


        var parser = this.parserFactoryFactory.CreateParser();
        foreach (var part in bodyparts)
        {
            using (var stream = part.ContentReadStream)
            {
                using (var streamReader = new StreamReader(stream))
                {
                    string content = streamReader.ReadToEnd();
                    var results = parser.Parse(content);
                }
            }
        }
        return new HttpResponseMessage(HttpStatusCode.Accepted);
    }  
[WebInvoke(Method=“POST”,UriTemplate=“{importFile}”)]
公共HttpResponseMessage上载(字符串导入文件、HttpRequestMessage请求)
{
如果(!request.Content.IsMimeMultipartContent())
{
抛出新的HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
//创建用于设置输出流的流提供程序
MultipartFormDataStreamProvider streamProvider=新的MultipartFormDataStreamProvider();
//使用我们刚刚创建的流提供程序读取MIME多部分内容。
var task=request.Content.ReadAsMultipartAsync(streamProvider);
task.Wait();
IEnumerable bodyparts=task.Result;
字符串提交器;
if(!bodyparts.TryGetFormFieldValue(“提交者”,out提交者))
{
提交人=“未知”;
}
//从流提供程序获取本地文件名列表
IDictionary BodyPartFileName=streamProvider.BodyPartFileName;
var parser=this.parserFactory.CreateParser();
foreach(车身零件中的var零件)
{
使用(var stream=part.ContentReadStream)
{
使用(var streamReader=新streamReader(stream))
{
string content=streamReader.ReadToEnd();
var results=parser.Parse(内容);
}
}
}
返回新的HttpResponseMessage(HttpStatusCode.Accepted);
}  
这是我的帖子

<h3>Data import test</h3>

<form action="/api/data/Upload" enctype="multipart/form-data" method="POST">
    <input type="file" name="importFile"/>
    <input type="submit" value="Upload"/>
</form>
数据导入测试

解决方案实际上相当简单。当我们不处理文件时,不需要MultipartFormDataStreamProvider。这对我的案子很有效

[WebInvoke(Method = "POST", UriTemplate = "{importFile}")]
public HttpResponseMessage Upload(
    string importFile, HttpRequestMessage request)
{
    if (!request.Content.IsMimeMultipartContent())
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);

    // Read the MIME multipart content 
    var task = request.Content.ReadAsMultipartAsync();            
    task.Wait();

    IEnumerable<HttpContent> bodyparts = task.Result;
    string submitter;
    if (!bodyparts.TryGetFormFieldValue("submitter", out submitter))
        submitter = "unknown";

    var parser = this.parserFactoryFactory.CreateParser();
    foreach (var part in bodyparts)
    {
        using (var stream = part.ContentReadStream)
        {
            using (var streamReader = new StreamReader(stream))
            {
                string content = streamReader.ReadToEnd();
                var results = parser.Parse(content);
                if (results.IsValid)
                    // do something
            }
        }
    }
    var message = new HttpResponseMessage(HttpStatusCode.Accepted);
    return message;
}  
[WebInvoke(Method=“POST”,UriTemplate=“{importFile}”)]
公共HttpResponseMessage上载(
字符串导入文件,HttpRequestMessage请求)
{
如果(!request.Content.IsMimeMultipartContent())
抛出新的HttpResponseException(HttpStatusCode.UnsupportedMediaType);
//阅读MIME多部分内容
var task=request.Content.ReadAsMultipartAsync();
task.Wait();
IEnumerable bodyparts=task.Result;
字符串提交器;
if(!bodyparts.TryGetFormFieldValue(“提交者”,out提交者))
提交人=“未知”;
var parser=this.parserFactory.CreateParser();
foreach(车身零件中的var零件)
{
使用(var stream=part.ContentReadStream)
{
使用(var streamReader=新streamReader(stream))
{
string content=streamReader.ReadToEnd();
var results=parser.Parse(内容);
if(results.IsValid)
//做点什么
}
}
}
var消息=新的HttpResponseMessage(HttpStatusCode.Accepted);
返回消息;
}  

这甚至可以编译吗?Result是一个MultipartMemoryStreamProvider-它如何转换为IEnumerable?我想应该是任务。结果。内容自从问题被回答以来已经有一段时间了。不幸的是,目前我无法验证此解决方案是否仍然有效做什么?@Stuberuser我不知道,我回答这个问题已经四年了