@manhng

Welcome to my blog!

Cookies in ASP.NET Web API 2

April 1, 2022 07:05

Cookies in ASP.NET Web API 2 (edit)

All about types of Action Results in the Web API – Dhananjay Kumar (debugmode.net)

Step by Step implementing Two-Way Data Binding in Vanilla JavaScript – Dhananjay Kumar (debugmode.net)

Why you need Proxy objects in JavaScript – Dhananjay Kumar (debugmode.net)

1) CreateResponse

Set Cookie

public HttpResponseMessage Login([FromBody] LoginRequest loginRequest)
{
var accessToken = "Abc...Xyz";

var httpResponse = Request.CreateResponse(httpStatusCode, response);
httpResponse.Headers.Add(ResponseHeader.RequestSubmittedAt, DateTime.Now.ToString("O"));

//Add Cookie to HttpResponseMessage
var cookie = new CookieHeaderValue("AccessToken", accessToken);
cookie.Expires = DateTimeOffset.Now.AddHours(3);
cookie.Domain = Request.RequestUri.Host;
cookie.Path = "/";
httpResponse.Headers.AddCookies(new CookieHeaderValue[] { cookie });

return httpResponse;
}

Get Cookie

var accessToken = string.Empty;

if (HttpContext.Current.Request.Cookies["AccessToken"] != null)
{
HttpCookie authCookie = HttpContext.Current.Request.Cookies["AccessToken"];
accessToken = authCookie.Value;
return accessToken;
}

Action Results in Web API 2 - ASP.NET 4.x | Microsoft Docs

A Web API controller action can return any of the following:

  1. void
  2. HttpResponseMessage
  3. IHttpActionResult
  4. Some other type

Depending on which of these is returned, Web API uses a different mechanism to create the HTTP response.

Return type How Web API creates the response
void Return empty 204 (No Content)
HttpResponseMessage Convert directly to an HTTP response message.
IHttpActionResult Call ExecuteAsync to create an HttpResponseMessage, then convert to an HTTP response message.
Other type Write the serialized return value into the response body; return 200 (OK).

Create Web API Response (tutorialsteacher.com)

2) CreateErrorResponse

You can return an error response to provide more detail.

public HttpResponseMessage Get()
{
    HttpError myCustomError = new HttpError("The file has no content or rows to process.") { { "CustomErrorCode", 42 } };
    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, myCustomError);
}

Would return:

{ 
    "Message": "The file has no content or rows to process.", 
    "CustomErrorCode": 42 
}

3) Sử dụng IHttpActionResult thông qua HttpResponseMessage

public IHttpActionResult SomeAction()
{
IHttpActionResult response;

//we want a 303 with the ability to set location
HttpResponseMessage responseMsg = new HttpResponseMessage(HttpStatusCode.RedirectMethod);
responseMsg.Headers.Location = new Uri("http://customLocation.blah");
response = ResponseMessage(responseMsg);
return response;
}

4) Sử dụng IHttpActionResult thay cho HttpResponseMessage

C# - ASP.NET WebAPI: How to use IHttpActionResult instead of HttpResponseMessage - Stack Overflow

There are two ways to deal with this

First one is simple by changing the return type and passing the HttpResponseMessage to ResponseMessage which returns a IHttpActionResult derived class.

[HttpGet]
[Route("UserAppointments/{email}")]
public IHttpActionResult UserAppointments(string email = null) {
    HttpResponseMessage retObject = null;    
    if (!string.IsNullOrEmpty(email)) {
        UserAppointmentService _appservice = new UserAppointmentService();
        IEnumerable<Entities.UserAppointments> app = _appservice.GetAppointmentsByEmail(email);

        if (app.Count() <= 0) {
            var message = string.Format("No appointment found for the user [{0}]", email);
            HttpError err = new HttpError(message);
            retObject = Request.CreateErrorResponse(System.Net.HttpStatusCode.NotFound, err);
            retObject.ReasonPhrase = message;
        } else {
            retObject = Request.CreateResponse(System.Net.HttpStatusCode.OK, app);
        }
    } else {
        var message = string.Format("No email provided");
        HttpError err = new HttpError(message);
        retObject = Request.CreateErrorResponse(System.Net.HttpStatusCode.NotFound, err);
        retObject.ReasonPhrase = message;

    }
    return ResponseMessage(retObject);
}

The alternative is to refactor the method to follow the syntax suggestions from Asp.Net Web API 2 documentation.

[HttpGet]
[Route("UserAppointments/{email}")]
public IHttpActionResult UserAppointments(string email = null) {
    if (!string.IsNullOrEmpty(email)) {
        var _appservice = new UserAppointmentService();
        IEnumerable<Entities.UserAppointments> app = _appservice.GetAppointmentsByEmail(email);
        if (app.Count() <= 0) {
            var message = string.Format("No appointment found for the user [{0}]", email);
            return Content(HttpStatusCode.NotFound, message);
        }
        return Ok(app);
    }
    return BadRequest("No email provided");
}

Reference Action Results in Web API 2

A. Các dạng Request của Restful API

Http Method gồm có 9 loại nhưng RESTful chỉ sử dụng 4 loại phổ biến

  • GET (SELECT): Trả về một Resource hoặc một danh sách Resource.
  • POST (CREATE): Tạo mới một Resource.
  • PUT (UPDATE): Cập nhật thông tin cho Resource.
  • DELETE (DELETE): Xoá một Resource.

Tương ứng với cái tên thường gọi là CRUD (Create, Read, Update, Delete)

B. Nguyên tắc thiết kế Restful

Khi chúng ta gửi 1 request tới 1 API nào đó thì sẽ có vài status code để nhận biết như sau:

  • 200 OK – Trả về thành công cho tất cả phương thức
  • 201 Created – Trả về khi một Resource được tạo thành công.
  • 204 No Content – Trả về khi Resource xoá thành công.
  • 304 Not Modified – Client có thể sử dụng dữ liệu cache.
  • 400 Bad Request – Request không hợp lệ
  • 401 Unauthorized – Request cần có auth.
  • 403 Forbidden – bị từ chối không cho phép.
  • 404 Not Found – Không tìm thấy resource từ URI.
  • 405 Method Not Allowed – Phương thức không cho phép với user hiện tại.
  • 410 Gone – Resource không còn tồn tại, Version cũ đã không còn hỗ trợ.
  • 415 Unsupported Media Type – Không hỗ trợ kiểu Resource này.
  • 422 Unprocessable Entity – Dữ liệu không được xác thực.
  • 429 Too Many Requests – Request bị từ chối do bị giới hạn.

API được thiết kế phải rõ ràng, nhìn vào phải biết được API thực hiện cái gì

C. Ưu điểm

  • Giúp cho ứng dụng trở nên rõ ràng hơn.
  • REST URL đại diện cho resource chứ không phải là hành động.
  • Dữ liệu được trả về với nhiều định dạng khác nhau như: xml, html, rss, json …
  • Code đơn giản và ngắn gọn.
  • REST chú trọng vào tài nguyên hệ thống.

Thiết Kế RESTful API + Gọi API Bằng HttpClient ASP.NET - Viblo

All about types of Action Results in the Web API – Dhananjay Kumar (debugmode.net)

We can implement IHttpActionResult to return a list of trainings in the HTTP response message, as shown below:


//In Models
    public class TrainingDataResponse : IHttpActionResult
    {
        List<Training> _data;
        HttpRequestMessage _request; 

        public TrainingDataResponse(List<Training> data, HttpRequestMessage request)
        {
            _data = data;
            _request = request; 

        }
        public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
        {
            var response = new HttpResponseMessage()
            {
                Content = new ObjectContent<List<Training>>(_data,new JsonMediaTypeFormatter()),
                RequestMessage = _request

            };
            return Task.FromResult(response);

        }
    }

//In ApiController

    [Route("Data")]
    [HttpGet]
    public IHttpActionResult GetData()
    {
        var data = GetAllTrainings();    
        return new TrainingDataResponse(data.ToList(), Request);
    }

Categories

Recent posts