本文的目的是介绍asp.net-web-api–如何在HttpReponseMessage上设置响应cookie?的详细情况,特别关注asp.netcorecookie的相关信息。我们将通过专业的研究
本文的目的是介绍asp.net-web-api – 如何在HttpReponseMessage上设置响应cookie?的详细情况,特别关注asp.net core cookie的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解asp.net-web-api – 如何在HttpReponseMessage上设置响应cookie?的机会,同时也不会遗漏关于.NET Core中间件中的反向代理“ set-cookie”响应未在浏览器中设置并且未在HttpResponseMessage中显示、.net Web API 2,return HttpResponseMessage with ObjectContent、asp.net core WebApi 返回 HttpResponseMessage、asp.net – .NET Web API HttpResponseMessage模式?的知识。
本文目录一览:- asp.net-web-api – 如何在HttpReponseMessage上设置响应cookie?(asp.net core cookie)
- .NET Core中间件中的反向代理“ set-cookie”响应未在浏览器中设置并且未在HttpResponseMessage中显示
- .net Web API 2,return HttpResponseMessage with ObjectContent
- asp.net core WebApi 返回 HttpResponseMessage
- asp.net – .NET Web API HttpResponseMessage模式?
asp.net-web-api – 如何在HttpReponseMessage上设置响应cookie?(asp.net core cookie)
解决方法
这是a blog post describing this approach,和MSDN topic.
如果这个程序集不是你的选择,这是我以前的一个选择:
以前的答案如下
我更喜欢在HttpResponseMessage的范围内保留HttpContext的方法,而HttpContext不能单独测试,并且根据主机不一定适用:
/// <summary> /// Adds a Set-Cookie HTTP header for the specified cookie. /// WARNING: support for cookie properties is currently VERY LIMITED. /// </summary> internal static void SetCookie(this HttpResponseHeaders headers,Cookie cookie) { Requires.NotNull(headers,"headers"); Requires.NotNull(cookie,"cookie"); var cookieBuilder = new StringBuilder(HttpUtility.UrlEncode(cookie.Name) + "=" + HttpUtility.UrlEncode(cookie.Value)); if (cookie.HttpOnly) { cookieBuilder.Append("; HttpOnly"); } if (cookie.Secure) { cookieBuilder.Append("; Secure"); } headers.Add("Set-Cookie",cookieBuilder.ToString()); }
然后,您可以在响应中包含一个cookie,如下所示:
HttpResponseMessage response; response.Headers.SetCookie(new Cookie("name","value"));
.NET Core中间件中的反向代理“ set-cookie”响应未在浏览器中设置并且未在HttpResponseMessage中显示
据我所知,您创建了HttpClientHandler
,但没有使用它来构建HttpClient
来进行请求。您仍在使用静态_httpClient
,它对您创建的cookie容器一无所知。
这应该是您使CookieContainer
仍然为空的原因。
看看here,了解如何从HttpResponseMessage
获取cookie。
CookieContainer cookies = new CookieContainer();
HttpClientHandler handler = new HttpClientHandler();
handler.CookieContainer = cookies;
_httpClient = new HttpClient(handler);
var targetRequestMessage = CreateTargetMessage(context,targetUri);
using (var responseMessage = await _httpClient.SendAsync(targetRequestMessage,HttpCompletionOption.ResponseHeadersRead,context.RequestAborted))
{
//var responseCookies = cookies.GetCookies(targetUri).Cast<Cookie>();
IEnumerable<Cookie> responseCookies = cookies.GetCookies(targetUri).Cast<Cookie>();
foreach (Cookie cookie in responseCookies)
{
if(cookie.Name=="ASP.NET_SessionId")
{
Console.WriteLine(cookie.Name + ": " + cookie.Value);
context.Response.Headers.Add("Set-Cookie",cookie.Name+"="+cookie.Value);
}
}
.net Web API 2,return HttpResponseMessage with ObjectContent
public async TaskHttpResponseMessage Register(AllenRegistration model) { 1. Will return 400 Error return Request.CreateResponse( HttpStatusCode.BadReques t); 2. Will return Json Type like {return1:A,returnBL:B} return new HttpResponseMessa
public async Task
{
1.
Will return 400 Error
return Request.CreateResponse(HttpStatusCode.BadRequest);
2.
Will return Json Type like {"return1":"A","returnB"L:"B"}
return new HttpResponseMessage(HttpStatusCode.OK)
{Content = new ObjectContent
asp.net core WebApi 返回 HttpResponseMessage
ASP.NET WebApi 2 中的示例代码:
[Route("values/{id}")]
public async Task<HttpResponseMessage> Get(string id) { var response = Request.CreateResponse(HttpStatusCode.OK); var accept = Request.Headers.Accept; var result = await _valuesService.Get(id); if (accept.Any(x => x.MediaType == "text/html")) { response.Content = new StringContent(result, Encoding.UTF8, "text/html"); } else { response.Content = new StringContent(result, Encoding.UTF8, "text/plain"); } return response; }
ASP.NET Core WebApi 中的示例代码:
[Route("values/{id}")]
public async Task Get(string id) { var accept = Request.GetTypedHeaders().Accept; var result = await _valuesService.Get(id); var data = Encoding.UTF8.GetBytes(result); if (accept.Any(x => x.MediaType == "text/html")) { Response.ContentType = "text/html"; } else { Response.ContentType = "text/plain"; } await Response.Body.WriteAsync(data, 0, data.Length); }
可以看到,改变还是很大的,主要是两方面:
没有了 Request.CreateResponse
,获取 Accept 需要通过 Request.GetTypedHeaders()
。
没有返回值,而是直接通过数据流的方式写入到 Response.Body
中。
asp.net – .NET Web API HttpResponseMessage模式?
public HttpResponseMessage Get(string id) { var app = apps.Single(c => c.Id == id); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new ObjectContent<object>(app,Configuration.Formatters.JsonFormatter) }; }
要么
public Application Get(string id) { return apps.Single(c => c.Id == id); }
我的问题是“正确”的方式? #2要短得多但是#1更好或#2自动做#1#?
解决方法
两种情况下的响应都是相同的(HttpResponseMessage).
HttpResponseMessage允许您使用HTTP协议(例如,通过Headers属性)并统一您的返回类型.
返回CLR类型可以更具可读性,但是您可以放松使用不同状态代码返回不同类型的灵活性,除非您使用动态或对象来抵消返回特定类型的目的.
就个人而言,我更喜欢使用IHttpActionResult(在v2中添加)并在控制器操作上为预期的返回类型指定ResponseTypeAttribute以提高可读性.
[HttpGet] [ResponseType(typeof(Portfolio))] public IHttpActionResult GetPortfolio([FromUri] long id) { // get portfolio return Ok(portfolio); }
您可以使用默认的IHttpActionResult实现轻松地操作响应消息(以RESTful方式)(请参阅上面的OkResult).避免自己构造HttpResponseMessage也可以保持代码清洁. Here是关于IHttpActionResult的官方文章,here是关于HttpResponseMessage和IHttpActionResult的有趣的SO对话.
关于asp.net-web-api – 如何在HttpReponseMessage上设置响应cookie?和asp.net core cookie的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于.NET Core中间件中的反向代理“ set-cookie”响应未在浏览器中设置并且未在HttpResponseMessage中显示、.net Web API 2,return HttpResponseMessage with ObjectContent、asp.net core WebApi 返回 HttpResponseMessage、asp.net – .NET Web API HttpResponseMessage模式?的相关信息,请在本站寻找。
本文标签: