GET请求可以正常工作,但在Web API 2

时间:2016-10-12 17:34:36

标签: c# asp.net asp.net-mvc iis asp.net-web-api2

我有一个使用MVC 5和Web API 2的项目。在本地,对Web API控制器的HTTP GET和POST请求都正常工作。当网站发布并部署到外部环境时,GET请求仍然有效,但POST请求会产生404.

这是我的API控制器:

public class ExampleApiController : ApiController
{
    [HttpPost]
    [Route("GetRoles")]
    public IHttpActionResult GetRoles([FromBody] string userName)
    {
        // ...
        return Json(response);
    }

    [HttpGet]
    [Route("GetUsers")]
    public HttpResponseMessage GetUsers()
    {
        HttpResponseMessage response;
        // ...
        return response;
    }
}

这是我的WebApiConfig.cs文件:

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

        GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

        config.Routes.MapHttpRoute(
            name: "Web API default route",
            routeTemplate: "api/{controller}/{action}",
            defaults: null
        );
    }
}

这是我的Global.asax文件:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

其他一些说明:

  • 我已经验证客户端正在进行的POST请求格式正确。
  • 我将以下代码添加到Web.config

    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
    </system.webServer>
    
  • 我正在部署我的应用程序的环境有一个需要身份验证的子域(例如,URL看起来像http://qa.example.com)。我正在测试(例如)http://username:password@qa.example.com/GetUsers

  • 我的控制器未使用RoutePrefix属性。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

问题已得到解决 - 对未来的读者来说并不是非常有用,但问题与服务器端的第三方安全客户端有关,特别是阻止请求。 Juliano's comment帮助我实现了这一目标。

答案 1 :(得分:-2)

我建议使用网络API文档(帮助页面)或招摇来检查您的网络API方法实际网址和参数。你必须遗漏一些东西。

前几天我遇到了类似的问题(post方法在本地工作,但没有在QA env上工作)但那次我得到405错误