我看到很多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
标头? - Paul Abbott