发送多部分表单数据时,请求的资源不支持http方法'POST'

时间:2017-03-31 19:10:34

标签: c# asp.net-web-api2 postman asp.net-web-api-routing

我有一个如下控制器:

[RoutePrefix("api/File")]
public class FileController : ApiController
{
        [HttpPost]
        [Route("Add")]        
        public async Task<HttpResponseMessage> AddFile()
        {
            if (!Request.Content.IsMimeMultipartContent())
            {
                this.Request.CreateResponse(HttpStatusCode.UnsupportedMediaType);
            }

            string root = HttpContext.Current.Server.MapPath("~/temp/uploads");
            var provider = new MultipartFormDataStreamProvider(root);
            var result = await Request.Content.ReadAsMultipartAsync(provider);

            foreach (var key in provider.FormData.AllKeys)
            {
                foreach (var val in provider.FormData.GetValues(key))
                {
                    if (key == "companyName")
                    {
                        var companyName = val;
                    }
                }
            }


            //Do whatever you want to do with your file here

            return this.Request.CreateResponse(HttpStatusCode.OK, "OK");
        }
}

如果我像邮递员那样在邮递员中发帖请求: enter image description here

WebApiConfig.cs

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        config.MapHttpAttributeRoutes();

        // Uncomment the following line of code to enable query support for actions with an IQueryable or IQueryable<T> return type.
        // To avoid processing unexpected or malicious queries, use the validation settings on QueryableAttribute to validate incoming queries.
        // For more information, visit http://go.microsoft.com/fwlink/?LinkId=279712.
        //config.EnableQuerySupport();

        // To disable tracing in your application, please comment out or remove the following line of code
        // For more information, refer to: http://www.asp.net/web-api
        config.EnableSystemDiagnosticsTracing();
        config.Formatters.Add(new BrowserJsonFormatter());
    }
}

该功能未受到影响 知道我做错了吗?

2 个答案:

答案 0 :(得分:1)

尝试更改注册属性路由的顺序:

// This must come first
config.MapHttpAttributeRoutes();

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

此外,如果您始终使用基于属性的路由,我建议您删除默认路由注册。

答案 1 :(得分:0)

看起来您正在使用属性路由。检查以确保已启用属性路由。

WebApiConfig.cs

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 }
        );
    }
}

您可能没有启用它,并且基于约定的路由无法使用HTTP方法匹配路由。