Web API获取多部分/表单数据响应的最简单方法

时间:2017-04-06 09:11:56

标签: c# .net asp.net-web-api iis-8 asp.net-web-api-routing

我有问题,但我看不出我做错了什么? 我想让最简单的方法可以让它工作我稍后会使它变得更复杂但是目前只想要命中post方法我甚至不关心里面的代码是否正常工作。

我唯一关心的是它发回OK 200回复​​。

目前我得到内部服务器错误500响应或405方法不允许响应,具体取决于我是尝试发送数据还是仅使用浏览器强制进行方法调用。

有一个IOS应用程序发送下面的帖子请求,我有一个测试PHP脚本,证明这是有效的。现在我想将它移动到应该在IIS 8上进行工作的服务器。但是,我甚至只是在进行连接时遇到困难:

POST /api/Image/Upload HTTP/1.1
Host: ServerName
Content-Type: multipart/form-data; boundary=-------------Boundary----------35042EC1-790C-4CDD-8E21-66E6B1025C2D
Connection: keep-alive
Accept: */*
filename: DefaultPrefix1.jpg
User-Agent: KameraApp/1 CFNetwork/808.3 Darwin/16.3.0
Content-Length: 5492253
Accept-Language: da-dk
Accept-Encoding: gzip, deflate

---------------Boundary----------35042EC1-790C-4CDD-8E21-66E6B1025C2D
Content-Disposition: form-data; name='image'; filename="DefaultPrefix1.jpg"
Content-Type: image/jpg

Image Data
End boundary

我如何尝试获取上述Multipart / form-data:

[RoutePrefix("api/Image")]
public class ImageController : ApiController
    {

        [HttpPost]
        [Route("Upload")]
        public IHttpActionResult Upload()
        {
            var files= HttpContext.Current.Request.Files;

            var aFile = files.Get(0);


            string filename = aFile.FileName;
            string path = @"C:\ImageUploaderService\UploadFolder";
            aFile.SaveAs(path + filename);
            return Ok("Working");
        }
    }

修改

根据以下建议更改为当前方法

我的WebApiConfig看起来像这样:

  public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

1 个答案:

答案 0 :(得分:1)

这是路由问题。如果打算使用attribute routing,请确保它是enabled

public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        // Attribute routing.
        config.MapHttpAttributeRoutes();

        // Convention-based routing.
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

相应地装饰目标控制器

[RoutePrefix("api/Image")]
public class ImageController : ApiController {        
    [HttpPost]
    [Route("Upload")] // Matches POST api/Image/Upload
    public IHttpActionResult Upload()
    {
        return Ok("I am working");
    }
}

从那里你应该能够包含你的附加功能。

如果您想阅读多部分数据,请考虑从请求的内容中获取。

var content = await Request.Content.ReadAsMiltipartAsync();
  

我唯一关心的是它发回OK 200回复​​。

     

我想让最简单的方法让这个工作我   会让它变得更复杂,但目前只想要这篇文章   要点击的方法我甚至不关心里面的代码是否正常工作   目前。

这个答案应该解决上述问题。任何进一步的问题都应该发布在其他问题中。