2016-05-19 10 views
0

ウェブAPIを使用してログイン機能を作成しています(n層アーキテクチャ)。 Login ControllerでNull応答を取得しています。ウェブAPIのログイン機能

まず、私はそれが私のコードのロジックであることを確認したいが正しく、それが正しいならば、なぜ私は

HttpResponseMessage response = client.GetAsync("api/Login/Login").Result; 

マイプロジェクトUIログインコントローラコードで応答がnull LoginCOntroller.cs

[HttpPost] 
     public ActionResult Login(LoginViewModel loginViewModel) 
     { 
      HttpClient client = new HttpClient(); 
      client.BaseAddress = new Uri("http://localhost:63465/"); 

      HttpResponseMessage response = client.GetAsync("api/Login/Login").Result; 
      if (response.IsSuccessStatusCode) 
      { 
       return RedirectToActionPermanent("Index", "Project"); 
      } 
      return View(loginViewModel); 
     } 
を取得しています

マイアピログインコントローラコード LoginController.cs

public HttpResponseMessage Login(LoginViewModel loginViewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     UserEntity userEntity = new UserEntity(); 
     userEntity.Email = loginViewModel.UserName; 
     userEntity.Password = loginViewModel.Password; 

     var login = new LoginManager().LoginAuthentication(userEntity); 

     if (login != null) 
     { 
      return Request.CreateResponse(login); 
     } 
    } 

    return Request.CreateResponse(true); 
} 

マイログインマネージャクラス LoginManager.cs

public class LoginManager 
    { 

    public UserEntity LoginAuthentication(UserEntity userDetails) 
    { 
     var userDetail = new LoginDa().LoginAuthentication(userDetails); 
     return userDetail; 
    } 
} 

あなたの方法を前に付けているので、もし私のデータアクセス層は LoginDa.cs

public class LoginDa 
{ 
    public UserEntity LoginAuthentication(UserEntity login) 
    { 
     using (var context = new ArcomDbContext()) 
     { 
      var loginDetail = context.userInformation.FirstOrDefault(p => p.Email == login.Email && p.Password == login.Password); 
      return loginDetail; 
     } 
    } 
} 
+0

ルーティングコードを掲載することはできますか? – Flaugzig

+0

これは私のRoute.configです。static static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute( "{リソース} .axd/{* pathInfo}"); routes.MapRoute( 名前: "Default"、 url: "{コントローラ}/{アクション}/{id}"、 デフォルト:new {controller = "Home"、action = "Index"、id = UrlParameter 。オプション} ); } ' –

+0

LoginControllerの上に[Httpget]アノテーションを追加しましたか? – Flaugzig

答えて

1

GetAsync方法は、あなたのAPIのメソッドをGET呼び出しますAPIで[HttpPost](これはすべきです)のHttpClientクラスのPOSTメソッドを呼び出す必要があります(たとえば、 - PostAsJsonAsync)。

次に、async/awaitパターンに従っていませんか?あなたはasyncメソッドを呼び出していますが、それを待っていません。

詳細はこちらhttp://blog.stephencleary.com/2012/02/async-and-await.html。以下の言ったすべてと

また、あなたはシオマネキ/ポストマンを使用して、あなたのAPIを呼び出すことができますあなたのコードが

public async Task<ActionResult> Login(LoginViewModel loginViewModel) 
{ 
    HttpClient client = new HttpClient(); 
    client.BaseAddress = new Uri("http://localhost:63465"); 
    var response = await client.PostAsJsonAsync("api/login", loginViewModel); //Since it's a post it will automatically trigger corresponding post method on your webAPI 
    if(response.StatusCode == System.Net.HttpStatusCode.OK) 
    { 
     return RedirectToActionPermanent("Index", "Project"); 
    } 
    return View(loginViewModel); 
} 

をどのように見えるべきかのか?