【问题标题】:Post a file to an ApiController将文件发布到 ApiController
【发布时间】:2018-03-17 15:53:49
【问题描述】:

我是 ApiControllers 的新手,我正在测试将文件从客户端发送到 api 并从此处保存。下面的代码确实有效,文件从客户端“复制”到服务器,但响应消息是“204 No Content” - 我应该注意这里的任何事情吗?

ApiController 代码是这样的:

    [HttpPost]      
    [Route("api/UploadFile")]     
    public async Task UploadFile()
    {
        string fileName = "myfilename.txt";
        Stream requestStream = await Request.Content.ReadAsStreamAsync();        

        using (FileStream fileStream = File.Create(@"C:\myDropFolder\" + fileName))
        {
            await requestStream.CopyToAsync(fileStream);
        }         
    }

对客户端的调用如下所示,从控制台应用程序进行测试:

 class Program
{
    static void Main(string[] args)
    {
        try
        {
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost:1741/api/UploadFile/");
            request.Method = WebRequestMethods.Http.Post;

            byte[] fileToSend = File.ReadAllBytes(@"C:\myDropFolder\tester.txt");
            request.ContentLength = fileToSend.Length;

            using (Stream requestStream = request.GetRequestStream())
            {
                // Send the file as body request. 
                requestStream.Write(fileToSend, 0, fileToSend.Length);
                requestStream.Close();
            }

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                Console.WriteLine("HTTP/{0} {1} {2}", response.ProtocolVersion, (int)response.StatusCode, response.StatusDescription);
                Console.ReadLine();            

        }
        catch (Exception)
        {
            throw;
        }
    }
}

【问题讨论】:

    标签: c# asp.net asp.net-web-api model-view-controller


    【解决方案1】:

    Web API 对于 POST 的默认响应状态代码是 204,对于 GET 是 200 (Action Results in Web API 2)。除非你返回IHttpActionResult,然后显式返回200:

    [HttpPost]      
    [Route("api/UploadFile")]     
    public async Task<IHttpActionResult> UploadFile()
    {
        string fileName = "myfilename.txt";
        Stream requestStream = await Request.Content.ReadAsStreamAsync();        
    
        using (FileStream fileStream = File.Create(@"C:\myDropFolder\" + fileName))
        {
            await requestStream.CopyToAsync(fileStream);
        }
        return Ok(); 
    }
    

    【讨论】:

    • 非常感谢阿林的解释!
    猜你喜欢
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多