Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs WebAPI CORS不允许Post请求_Angularjs_Asp.net Mvc_Asp.net Web Api_Asp.net Web Api2 - Fatal编程技术网

Angularjs WebAPI CORS不允许Post请求

Angularjs WebAPI CORS不允许Post请求,angularjs,asp.net-mvc,asp.net-web-api,asp.net-web-api2,Angularjs,Asp.net Mvc,Asp.net Web Api,Asp.net Web Api2,我已经用尽了我能找到的关于Cors的所有资源,当从Angular的$http服务(通过Chrome)发送请求时,我仍然收到以下错误消息: 让请求正常工作。我发现了上百种类似的说明,似乎对其他人有用,但我就是无法破解这个。我会发布我的代码 WebApiConfig: public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web AP

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

让请求正常工作。我发现了上百种类似的说明,似乎对其他人有用,但我就是无法破解这个。我会发布我的代码

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




    }
}
我试着用我在网上找到的各种东西来修改我的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:问题是两个方法的默认路由之间存在冲突。我不确定为什么会是这样,但只要我为它们指定了一个明确的路由,问题就解决了。如果有人知道,我仍然有兴趣知道答案。谢谢大家

如果在Web API后期控制器操作中设置断点,它是否未命中?HTTP 500通常表示代码有问题(未处理的异常)


如果它没有命中控制器操作,则必须在管道中的较早位置。您是否尝试过直接从POSTman之类的东西发布到API方法?非常有用的Chrome扩展..

WebAPI支持基于约定的路由:

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

你确定里面没有两个方法,一个叫PostXXX,一个叫XXX?或者可能名为POSTxxx的路由正在触发基于约定的路由。我看到有人提到“约定可能导致路由表中的冲突,匹配错误的操作。”

尝试将您的方法重命名为Postxxx、Getxxx等以外的其他方法


[PS属性路由更好]

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

public LoginResult PostLoginByHandle([FromBody]LoginRequest req)
2-而且,就参数数量和req参数的数据类型而言,这两种方法具有完全相同的签名


希望有帮助。

我今天遇到了同样的问题。事实证明,问题出在飞行前选项请求中。我使用了这个解决方案:

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

protected void Application_BeginRequest()
{
    //CORS
    if (Request.Headers.AllKeys.Contains("Origin"))
    {
        Response.Headers.Add("Access-Control-Allow-Origin", string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["CORS_ORIGIN"]) ? "*" : ConfigurationManager.AppSettings["CORS_ORIGIN"]);
        Response.Headers.Add("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, DELETE");
        Response.Headers.Add("Access-Control-Allow-Headers", "Access-Control-Allow-Methods, Access-Control-Allow-Origin, Content-Type, Accept, X-Requested-With, Session");
        //handle CORS pre-flight requests
        if (Request.HttpMethod == "OPTIONS")
            Response.Flush();
    }
}

是的。试着向邮递员或小提琴手提出请求,这样cors就不在考虑范围之内了,看看它是否有效。我同意问题可能在其他地方。它没有击中控制器。邮递员会有同样的Cors问题吗?我有点搞不清楚什么才算是交叉起源。我从WebStorm内置服务器运行前端,该服务器也是具有不同端口号的本地主机。我很惊讶一开始就因为这个原因出现了错误。我删除了刚才编辑的顶部方法,从而击中了控制器。我会搞乱路由,但这种冲突对我来说似乎很奇怪。当我明确指定路由时,问题就消失了。不知道为什么会这样,但如果有人知道原因,我很想知道。我列出的两种方法是该控制器中仅有的两种方法。对他们来说真的没什么。也许有一个基于登录前缀的约定?我学到了我的教训——从现在起我将使用属性。我能够在没有属性的情况下击中控制器。多么奇怪的公约副作用!啊。。。您的默认路由不包含该操作,因此它正在查找任何匹配的方法。看到了吗。谜团解开了。谢谢我是一名MVC开发人员,在专业领域只工作了一年,所以我很欣赏这方面的知识。我同意前面的帖子:属性路由是一条路要走。
public LoginResult PostLoginByHandle([FromBody]LoginRequest req)
protected void Application_BeginRequest()
{
    //CORS
    if (Request.Headers.AllKeys.Contains("Origin"))
    {
        Response.Headers.Add("Access-Control-Allow-Origin", string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["CORS_ORIGIN"]) ? "*" : ConfigurationManager.AppSettings["CORS_ORIGIN"]);
        Response.Headers.Add("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, DELETE");
        Response.Headers.Add("Access-Control-Allow-Headers", "Access-Control-Allow-Methods, Access-Control-Allow-Origin, Content-Type, Accept, X-Requested-With, Session");
        //handle CORS pre-flight requests
        if (Request.HttpMethod == "OPTIONS")
            Response.Flush();
    }
}