WebAPI CORS不允许发布请求

时间:2014-10-25 05:40:16

标签: asp.net-mvc angularjs asp.net-web-api cors asp.net-web-api2

我已经用尽了所有关于Cors的资源,并且在从Angular的$ http服务(通过Chrome)发送请求时仍然收到以下错误消息:

POST http://localhost:61459/api/LoginAuth/PostLoginByHandle 500 (Internal Server Error) 

请求工作正常。我已经找到了一百种类似的指令,似乎对其他人有效,但我无法解决这个问题。我会发布我的代码。

WebApiConfig:

public static class 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 }
        );

        //var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
        //jsonFormatter.SerializerSettings = new CamelCasePropertyNamesContractResolver();

        var cors = new EnableCorsAttribute("*", "*", "*");
        config.EnableCors(cors);




    }
}

根据我的理解,这应该足以允许全球任何Cors请求。另外,我用控制器标记控制器:

[EnableCors(origins: "*", headers: "*", methods: "*")]

我已尝试使用我在网上找到的各种内容修改我的web.config,但我已经读过,以编程方式执行此操作时没有必要。知道我做错了吗?

我已经将这篇文章标记为angularjs,以防我在那里做错了,因为我对它很新。这是我的电话:

    $http.post("http://localhost:61459/api/LoginAuth/PostLoginByHandle",this.LoginRequest).success(function(data){
  testCtrl.user = data;
  console.log("Retrieved: " + data);
});

**编辑:当我删除top方法时,我可以用Postman命中控制器。知道为什么这些会发生冲突吗?邮差给出了这个错误:

"Message": "An error has occurred.",
"ExceptionMessage": "Multiple actions were found that match the request: \r\nLoginByKey on type RecruitingTool.Web.Controllers.LoginAuthController\r\nPostLoginByHandle on type RecruitingTool.Web.Controllers.LoginAuthController"

这是控制器代码。我不明白为什么这些会发生冲突:

    [HttpPost]
    public LoginResult LoginByKey(LoginRequest req)
    {
        LoginResult l = new LoginResult();
        if (!string.IsNullOrEmpty(req.Key) &&
            HttpContext.Current.Cache["credentials." + req.Username.ToUpper()].ToString() == req.Key)
        {
            l.Success = true;
        }
        else
        {
            l.Success = false;
            l.ErrorMessage = "The credentials key is not valid.";
        }
        return l;
    }


    [HttpPost]
    [EnableCors(origins: "*", headers: "*", methods: "POST")]
    public LoginResult PostLoginByHandle(LoginRequest req)
    {
        LoginResult l = new LoginResult();
        if (req.Username.ToUpper() == "TESTUSER" && req.Password == "test")
        {
            //change to authenticate against DB
            l.Success = true;
            l.CredentialsKey = Guid.NewGuid().ToString();
            l.ErrorMessage = "";
            HttpContext.Current.Cache["credentials." + req.Username.ToUpper()] = Guid.NewGuid().ToString();
        }
        else
        {
            l.Success = false;
            l.ErrorMessage = "The username or password is not correct. Please check your information and try again.";
        }

        return l;
    }

**编辑2:问题是两种方法的默认路由之间存在冲突。我不确定为什么会出现这种情况,但是一旦我为它们指定了明确的路线,它就会被解决。如果有人知道,我仍然有兴趣知道答案。谢谢大家!

4 个答案:

答案 0 :(得分:2)

如果你在你的Web API POST控制器中放置了一个断点,它是不是会命中它? HTTP 500通常表示您的代码存在一些问题(未处理的异常)。

如果它没有达到控制器动作,它必须在管道中更早。您是否尝试过从POSTman这样的方法直接发布到您的API方法?非常有用的Chrome扩展程序..

答案 1 :(得分:1)

WebAPI支持基于约定的路由:

  

要查找操作,Web API会查看HTTP方法,然后查找名称以该HTTP方法名称开头的操作。例如,对于GET请求,Web API会查找以“Get ...”开头的操作,例如“GetContact”或“GetAllContacts”。此约定仅适用于GET,POST,PUT和DELETE方法。您可以使用控制器上的属性启用其他HTTP方法。我们稍后会看到一个例子。

你确定你没有两种方法,一种叫做PostXXX,另一种叫做XXX?或者名为POSTxxx的那个可能会触发基于约定的路由。我已经看到提到“约定可能导致路由表中的冲突,匹配不正确的操作。”

尝试将您的方法重命名为Postxxx,Getxxx,...

以外的其他方法

[PS属性路由要好得多]

答案 2 :(得分:1)

1-您的方法参数缺少[FromBody]属性,因此它应该像

public LoginResult PostLoginByHandle([FromBody]LoginRequest req)

2-此外,就参数数量和req参数的数据类型而言,两种方法都具有完全相同的签名。

希望有所帮助。

答案 3 :(得分:0)

我今天遇到了同样的问题。事实证明问题出在飞行前的OPTIONS请求中。我使用了这个解决方案:Handling CORS Preflight requests to ASP.NET MVC actions

此外,我将标题添加到响应中,并从项目中删除了Microsoft.AspNet.WebApi.Cors:

pinchGesture()
相关问题