9

このチュートリアルに従おうとしていますが、彼のコードをコピーして貼り付けても、ApiController で 2 つのコンパイル エラーが発生することに気付きました。

IEnumerable<HttpContent> bodyparts = Request.Content.ReadAsMultipartAsync(streamProvider);

これは、ReadAsMultipartAsync の戻り値を HttpContent の IEnumerable にキャストできないことを示しています。

IDictionary<string, string> bodypartFiles = streamProvider.BodyPartFileNames;

これは、BodyPartFileNames が streamProvider に存在しないことを示しています。これは、チュートリアルだけでなく、他のいくつかのブログ投稿や、私が見た StackOverflow の質問にも反しているようです。

誰が契約が何であるか知っていますか?

完全なファイル:

using AsyncFileUpload.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http;


namespace AsyncFileUpload.Controllers
{
    public class UploadingController : ApiController
    {
        private const string PATH = "C:\\_projects\\learning";

        [HttpPost]
        public async Task<IList<FileDesc>> Post()
        {
            List<FileDesc> result = new List<FileDesc>();
            if (Request.Content.IsMimeMultipartContent())
            {
                try
                {
                    if (!Directory.Exists(PATH))
                    {
                        Directory.CreateDirectory(PATH);
                    }

                    MultipartFormDataStreamProvider streamProvider =
                        new MultipartFormDataStreamProvider(PATH);

                    IEnumerable<HttpContent> bodyparts = Request.Content.ReadAsMultipartAsync(streamProvider);
                    IDictionary<string, string> bodypartFiles = streamProvider.BodyPartFileNames;
                    IList<string> newFiles = new List<string>();

                    foreach (var item in bodypartFiles)
                    {
                        var newName = string.Empty;
                        var file = new FileInfo(item.Value);

                        if (item.Key.Contains("\""))
                        {
                            newName = Path.Combine(file.Directory.ToString(),
                                item.Key.Substring(1, item.Key.Length - 2));
                        }
                        else
                        {
                            newName = Path.Combine(file.Directory.ToString(), item.Key);
                        }

                        File.Move(file.FullName, newName);
                        newFiles.Add(newName);
                    }

                    var uploadedFiles = newFiles.Select(i =>
                        {
                            var fi = new FileInfo(i);
                            return new FileDesc(fi.Name, fi.FullName, fi.Length);
                        }).ToList();

                    result.AddRange(uploadedFiles);
                }
                catch (Exception e)
                {
                    // NOOP
                }
            }
            return result;
        }
    }
}
4

1 に答える 1

16

ReadAsMultipartAsync は Task<> オブジェクトを返します。.Result プロパティ (ブロック) を取得するか、await キーワードを使用してタスクを待機します (推奨)。

BodyPartFileNames は RTM リリースで変更され、FileData プロパティを使用するようになりました。

参照: http://www.asp.net/web-api/overview/working-with-http/sending-html-form-data,-part-2

于 2012-08-21T20:54:37.120 に答える