2016-10-07 3 views
0

Я создал WEB API, используя ASP.NET MVC WEB API 2.0. Веб-API содержит методы, такие как login, register и т. Д.
Я использую AngularJS для вызова методов WEB API, но он вызывает два раза. Напр. когда я звоню POST метод это первый звонок OPTION (я не создал никакого метода OPTION), а затем он вызывает метод POST.
Мой код: (для входа в систему)
HTML:

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


AngularJS Контроллер:

$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 = '/'; 
       } 
      }); 
} 


WEB API:

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; 
     } 
    } 
+0

[ActionName] (https://msdn.microsoft.com/en-us/library/system.web.mvc.actionnameattribute (v = vs.118) .aspx) специфичен для MVC, а не для Web API. Вы должны использовать [Маршрут] (https://msdn.microsoft.com/en-us/library/system.web.http.routeattribute (v = vs.118).aspx) на ваших маршрутах ApiController. Я не знаю, о чем вы говорите, хотя, когда вы говорите, что он должен называть «Option», и нет указания, что он должен дважды вызвать метод входа в систему для одного вызова. – Igor

+0

Какой сервер вы используете для размещения/обслуживания кода 'AngualrJS'? –

ответ

5

Это поведение браузера по умолчанию. Перед отправкой corss-домен AJAX вызова, браузер посылает (запрос OPTION) в pre-flight requestWhy?

взглянуть над here о том, как можно свести к минимуму запрос предполетную:

Update

Если вы действительно хотите не отправлять запрос перед полетом, вы можете отказаться от того, чтобы не нарушать Одинаковую политику происхождения (SOP). Возможным решением может быть:

JSONP: Это метод, который использует исключение элемента HTML-скрипта в политике безопасности одного и того же происхождения. Теги скрипта могут загружать JavaScript из другого домена, а параметры запроса могут быть добавлены в URI сценария для передачи информации серверу, на котором размещен скрипт, о ресурсах, к которым вы хотите получить доступ. Сервер JSONP вернет JavaScript, который оценивается в браузере, который вызывает согласованную функцию JavaScript, уже находящуюся на странице, для передачи данных ресурса сервера на вашу страницу.

Серверный прокси-сервер: Альтернатива обходам политики одного и того же происхождения для выполнения кросс-доменных запросов - это просто не делать каких-либо кросс-доменных запросов вообще! Если вы используете прокси-сервер, который находится в вашем домене, вы можете просто использовать его для доступа к внешней службе из вашего внутреннего кода и перенаправления результатов на ваш код клиента. Поскольку запрашивающий код и прокси-сервер находятся в одном домене, SOP не нарушается.

UPDATE Вы можете ответить на ВАРИАНТЫ затребовать от Web API 2, так что не бросайте 405 или 404. Посмотри здесь https://stackoverflow.com/a/37425746/2509344

0

Это происходит из-за, когда-либо страница загружается , в это время во время инициализации это происходит один раз, а затем, когда вы будете нажимать логин, он снова вызовет.

Смежные вопросы