2017-01-25 11 views
1

ログインに成功した後、私は返信したいオブジェクトと共に応答ヘッダーにsession_idを返します。web api2のヘッ​​ダーにセッションIDを設定して返す方法

典型的なレスポンスヘッダーは次のとおりです。

Response 
Header: Set-cookie: session_id=121212-343dsfsd-4323132, path=/, expires: 1212 
Body: { 
    “status”: 0, 
    “data”: { 
     “userRole”: “SUPER_ADMIN” 
    } 
} 

私は以下のように達成しようとしています。

bool result = //...validate username and password with database 

if(result == true) 
{ 
    SessionIDManager manager = new SessionIDManager(); 
    string newSessionId= manager.CreateSessionID(HttpContext.Current); 
    var resp = new HttpResponseMessage(); 
    var cookie = new CookieHeaderValue("session-id",newSessionId); 
    cookie.Expires = DateTimeOffset.Now.AddDays(1); 
    cookie.Domain = Request.RequestUri.Host; 
    cookie.Path = "/"; 
    resp.Headers.AddCookies(new CookieHeaderValue[] { cookie }); 
    //return resp; 
    obj.UserRole = (from c in entityObject.NCT_UserRegistration where obj.User_Name == c.User_Name && obj.User_Password == c.User_Password select c.User_Role).FirstOrDefault(); 
    obj.Success = 0; 
    obj.User_Password=""; 
    return Ok(obj); 
} 

正しいかどうかはわかりません。上記のようにsessionidを返すにはどうすればよいですか?

答えて

1

リファクタリング上記のコード

if(result == true) { 

    obj.UserRole = (from c in entityObject.NCT_UserRegistration where obj.User_Name == c.User_Name && obj.User_Password == c.User_Password select c.User_Role).FirstOrDefault(); 
    obj.Success = 0; 
    obj.User_Password = ""; 

    var response = Request.CreateResponse(HttpStatusCode.OK, obj); 

    var newSessionId = new SessionIDManager().CreateSessionID(HttpContext.Current); 
    var cookie = new CookieHeaderValue("session-id", newSessionId); 
    cookie.Expires = DateTimeOffset.Now.AddDays(1); 
    cookie.Domain = Request.RequestUri.Host; 
    cookie.Path = "/"; 

    response.Headers.AddCookies(new[] { cookie }); 

    return ResponseMessage(response); 
} 

主な違いを次のように応答が作成され、返される方法です。元のコードは、手動で新しいレスポンスを作成し、クッキーを入力して、ボディからクッキーを差し引いた全く別のレスポンスを返していました。すなわち:Ok(obj)

上記のコードは、返されるオブジェクト値を含むレスポンスを作成し、次にクッキーヘッダー情報がレスポンスに追加されます。

OPの本来の意図がIHttpActionResultを返すようにした場合、ResponseMessage(response)IHttpActionResult派生実装でHttpResponseMessageをラップします。

関連する問題