Angularjs $http调用web api时调用两次

Angularjs $http调用web api时调用两次,angularjs,asp.net-mvc,asp.net-web-api2,Angularjs,Asp.net Mvc,Asp.net Web Api2,我已经使用ASP.NET MVC WEB API 2.0创建了一个WEB API。Web API包含登录、注册等方法。 我使用AngularJS调用WEB API方法,但它调用了两次。例如,当我调用POST方法时,它首先调用选项,我没有创建任何选项方法,然后它调用POST方法。 我的代码:用于登录 HTML: WEB API: 这是浏览器的默认行为。在发送corss域AJAX调用之前,浏览器会发送一个选项请求 了解如何最大限度地减少飞行前请求: 更新 如果您确实不想发送飞行前请求,您可以选择

我已经使用ASP.NET MVC WEB API 2.0创建了一个WEB API。Web API包含登录、注册等方法。 我使用AngularJS调用WEB API方法,但它调用了两次。例如,当我调用POST方法时,它首先调用选项,我没有创建任何选项方法,然后它调用POST方法。 我的代码:用于登录 HTML:

WEB API:


这是浏览器的默认行为。在发送corss域AJAX调用之前,浏览器会发送一个选项请求

了解如何最大限度地减少飞行前请求:

更新

如果您确实不想发送飞行前请求,您可以选择不违反同一原产地政策SOP。可能的解决办法是:

:这是一种利用HTML脚本元素异常执行同源安全策略的技术。脚本标记可以从不同的域加载JavaScript,并且可以将查询参数添加到脚本URI中,以便将有关您希望访问的资源的信息传递给承载脚本的服务器。JSONP服务器将返回在浏览器中计算的JavaScript,该浏览器调用页面上已有的商定JavaScript函数,以将服务器资源数据传递到页面中

服务器端代理:绕过同源策略执行跨域请求的另一种方法是根本不进行任何跨域请求!如果使用驻留在域中的代理,只需使用它从后端代码访问外部服务,并将结果转发到客户端代码。因为请求代码和代理驻留在同一个域中,所以不会违反SOP

更新
您可以响应来自WebAPI2的选项请求,这样就不会抛出405或404。请看这里

发生这种情况的原因是,无论何时加载页面,在初始化过程中都会发生一次,然后当您现在按login时,它会再次调用。

特定于MVC,而不是Web API。您应该在ApiController路由上使用。我不知道你在说什么,但是当你说它应该调用Option时,没有迹象表明它应该为一次调用调用登录方法两次。你正在使用哪个服务器托管/服务AngualrJS代码?
<div class="container" ng-controller="UserAccount">
    <form ng-submit="loginNow(user)">
        <input type="email" placeholder="Enter Email" required ng-model="user.email" id="txtEmail" class="form-control" />
        <br />
        <input type="password" placeholder="Enter Password" required ng-model="user.password" id="txtPwd" class="form-control" />
        <br />
        <button type="submit" class="btn btn-primary">Login</button>
    </form>
</div>
$scope.loginNow = function (user) {
        $http.post(rootURL + "login", { email: user.email, password: user.password })
            .success(function (data) {
                if (data.id > 0) {
                    sessionStorage.setItem('userid', data.id);
                    window.location = '/';
                }
            });
}
public class UsersController : ApiController
    {
        private UserEntities db = new UserEntities();

        // GET: api/Users
        public IQueryable<Users_tbl> GetUsers_tbl()
        {
            return db.Users_tbl;
        }

        [ActionName("login")]
        public IHttpActionResult PostUser_Login(string email, string password)
        {
            int id = db.Users_tbl.Where(a => a.email == email && a.password == password).Select(a => a.id).SingleOrDefault();
            if(id <= 0)
            {
                return NotFound();
            }
            return Ok(id);
        }

        [ActionName("register")]
        public int PostUser_Register(string email, string password)
        {
            int id = db.Users_tbl.Where(a => a.email == email).Select(a => a.id).SingleOrDefault();
            if(id > 0)
            {
                return 1;
            }
            Users_tbl user = new Users_tbl();
            user.email = email;
            user.password = password;
            try
            {
                db.Users_tbl.Add(user);
                db.SaveChanges();
            }
            catch
            {
                return 2;
            }
            return 0;
        }


        // GET: api/Users/5
        [ResponseType(typeof(Users_tbl))]
        public IHttpActionResult GetUsers_tbl(int id)
        {
            Users_tbl users_tbl = db.Users_tbl.Find(id);
            if (users_tbl == null)
            {
                return NotFound();
            }

            return Ok(users_tbl);
        }


        // PUT: api/Users/5
        [ResponseType(typeof(void))]
        public IHttpActionResult PutUsers_tbl(int id, Users_tbl users_tbl)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != users_tbl.id)
            {
                return BadRequest();
            }

            db.Entry(users_tbl).State = EntityState.Modified;

            try
            {
                db.SaveChanges();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!Users_tblExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return StatusCode(HttpStatusCode.NoContent);
        }

        [ActionName("profile")]
        // POST: api/Users
        [ResponseType(typeof(Users_tbl))]
        public IHttpActionResult PostUsers_tbl(Users_tbl users_tbl)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            db.Users_tbl.Add(users_tbl);
            db.SaveChanges();

            return CreatedAtRoute("DefaultApi", new { id = users_tbl.id }, users_tbl);
        }

        // DELETE: api/Users/5
        [ResponseType(typeof(Users_tbl))]
        public IHttpActionResult DeleteUsers_tbl(int id)
        {
            Users_tbl users_tbl = db.Users_tbl.Find(id);
            if (users_tbl == null)
            {
                return NotFound();
            }

            db.Users_tbl.Remove(users_tbl);
            db.SaveChanges();

            return Ok(users_tbl);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }

        private bool Users_tblExists(int id)
        {
            return db.Users_tbl.Count(e => e.id == id) > 0;
        }
    }