【发布时间】:2016-08-31 20:31:27
【问题描述】:
我看到很多 WebAPI 接受文件的示例。但是,我还没有找到一个解决方案,为什么不管我尝试了什么,让我的 HttpContext.Current.Request.Files 有一个我通过 Postman 发布到 Web API 的文件。 (我也通过控制台应用程序发布了该图像并得到了相同的结果)
[HttpPost]
[ActionName("Post")]
[ResponseType(typeof(PeliquinApiRsp))]
public IHttpActionResult Post(int personId)
{
var empPicture = PeliquinIOC.Resolve<IEmpPictureBL>(UserId, UserName, PropertyCode);
if (!(IsAllowed(SysPrivConstants.SYSPRIV__TYPE_PERSONNEL, SysPrivConstants.SYSPRIV__FUNC_PERSONNEL_CARDHOLDER, SysPrivConstants.SYSPRIV__LEVEL_FULL)))
return (Unauthorized());
var apiRsp = new PeliquinApiRsp();
var httpRequest = HttpContext.Current.Request;
if (httpRequest.Files.Count == 0)
return BadRequest();
empPicture.Post(httpRequest.Files[0].InputStream, personId);
apiRsp.SetStatus();
apiRsp.SetData("EmpPicture");
return (Ok(apiRsp));
}
这是一个非常简单的方法。我一直在使用 Postman 发布二进制 .jpg 文件。我已经设置了 content-type = "multipart/form-data"。除了 .Files = 0 之外,我的代码中没有任何错误。
我在我的 WebApiConfig 中为 API 的其余部分提供了一些额外的设置,但为了以防万一,我会将它们与此特定方法的路由一起包括在内:
config.Formatters.Remove( config.Formatters.XmlFormatter );
config.Formatters.JsonFormatter.SupportedMediaTypes.Add( new MediaTypeHeaderValue( "application/json" ) );
config.Formatters.FormUrlEncodedFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("multipart/form-data"));
config.Routes.MapHttpRoute(
name: "EmpPicturePost",
routeTemplate: "api/EmpPicture/{personId}",
defaults: new { controller = "EmpPicture", action = "Post" },
constraints: new { personId = @"^\d+$", httpMethod = new HttpMethodConstraint(HttpMethod.Post, HttpMethod.Options) }
);
我无计可施,试图弄清楚为什么这么简单的事情却行不通。我已经尝试了很多其他方法,它们都更像 MVC,但这不是 MVC 应用程序,它们会抛出不同的错误。感谢您的帮助。
【问题讨论】:
-
您是使用
form-data单选按钮还是仅设置content-type标头? -
我正在使用二进制单选按钮,并在我的本地驱动器上选择一个 .jpg 文件。我也在设置内容类型标题。
-
我还创建了一个全新的 Web API 并使用内置的默认 ValuesController 并尝试向其发布图像,并导致了同样的问题。
标签: c# asp.net postman httpcontext