ช่วยให้คุณเพิ่มคุกกี้สำหรับ ihttpactionResult ในคอนโทรลเลอร์ WebAPI
สารบัญ
มีหลายวิธีในการเพิ่มคุกกี้ในการตอบสนองใน webapi วิธีที่แนะนำตามเอกสารคือการใช้วิธีการขยาย resp.Headers.AddCookies(cookies) แต่มีข้อเสียบางประการ:
= ถ่านในค่าคุกกี้CookieHeaderValue รองรับคู่ชื่อชื่อและคอลเลกชันดังกล่าวจะถูกนำเสนอเป็น cookie-name=key1=value1&key2=value2 แต่คอลเลกชันจะถูกเข้ารหัสหากคุณจะพยายามตั้งค่าผ่านสตริงผ่าน การผ่านสตริงคอลเลกชันคุกกี้โดยตรงมีประโยชน์สำหรับกรณีเมื่อคุณผ่านค่าคุกกี้ผ่านบริการเช่นการรวมเข้ากับ API ที่ใช้คุกกี้แบบดั้งเดิม อีกวิธีหนึ่งคือการตั้งค่าคุกกี้บน httpresponse.cookies ผ่าน HttpContext (ตรวจสอบตัวอย่าง) แต่มีข้อเสียที่ร้ายแรงกว่า:
HttpContext ใน webapi นั้นเป็นวิธีปฏิบัติที่ไม่ดีเพราะคุณไม่สามารถรับพวกเขาในโฮสต์ตัวเองได้new Thread() ดีกว่าที่จะมี API ง่าย ๆ สำหรับ IHttpActionResult โดยไม่มีข้อเสียที่อธิบายไว้ นอกจากนี้ยังมีการสนับสนุนในท้องถิ่นหรือ "เปิดใช้งานคุกกี้เหล่านี้สำหรับโดเมนย่อยทั้งหมด" คุณสมบัตินอกกรอบ
คุณสามารถติดตั้งแพ็คเกจ aspnet.webapi.cookiespassthrough ผ่าน Nuget
var cookieDescriptors = new [ ]
{
// simple cookie with Path=/
new CookieDescriptor ( "test-cookie" , "1" ) ,
// encode
new CookieDescriptor ( "test-cookie2" , "2=" ) {
CodeStatus = CookieCodeStatus . Encode
} ,
// expires, secure, httponly + decode
new CookieDescriptor ( "test-cookie3" , "a%3D3" ) {
Secure = true ,
CodeStatus = CookieCodeStatus . Decode ,
HttpOnly = true ,
Expires = new DateTime ( 2118 , 1 , 1 )
} ,
// path will be added and no decode or encode
new CookieDescriptor ( "test-cookie4" , "4%3D=" ) {
Path = "/subfolder/"
} ,
} ;
// also you can use Request.GetReferrerHost() to get referrer's host which is useful when you're developing AJAX API
return Ok ( ) . AddCookies ( cookieDescriptors , Request . GetRequestHost ( ) ) ;คุณสามารถเปิดใช้งานคุกกี้สำหรับโดเมนย่อยทั้งหมด:
// domain will be ".example.org"
return Ok ( ) . AddCookies ( cookieDescriptors , "example.org" ) . EnableCookiesForAllSubdomains ( ) ;
// same, domain will be ".example.org"
return Ok ( ) . AddCookiesForAllSubdomains ( cookieDescriptors , "www.example.org" ) ;
// or even this
return Ok ( )
. AddCookiesForAllSubdomains ( cookieDescriptorsForAllSubdomains , "example.org" )
. AddCookies ( cookieDescriptorsForOneDomain , "example.com" )
. AddCookies ( cookieDescriptorsForAnotherDomainAndAllSubdomains , "www.example.net" )
. EnableCookiesForAllSubdomains ( ) ; เบราว์เซอร์มีปัญหากับคุกกี้ในพื้นที่ หากคุณจะระบุโดเมนเป็น localhost หรือแม้กระทั่ง .localhost มันจะไม่ถูกเพิ่มเข้าไปในการตอบสนองเลยเพื่อให้คุกกี้กับการทำงานในท้องถิ่นสำหรับเบราว์เซอร์เกือบทั้งหมด
เมื่อคุณโทร .EnableCookiesForAllSubdomains() หรือใช้ .AddCookiesForAllSubdomains(...) การแปลงโดเมนต่อไปนี้จะถูกนำไปใช้:
"localhost" => " "
" . localhost " => " "
"www.localhost" => ".www.localhost"
"www.localhost.ru" => ".localhost.ru"
"www.org" => ".www.org"
".www.org" => ".www.org"
"example.org" => ".example.org"
"www.example.org" => ".example.org"
".www.example.org" => ".www.example.org" ตรวจสอบ AspNet.WebApi.CookiesPassthrough.Example Project