GVKun编程网logo

asp.net-web-api – 如何在HttpReponseMessage上设置响应cookie?(asp.net core cookie)

8

本文的目的是介绍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)

asp.net-web-api – 如何在HttpReponseMessage上设置响应cookie?(asp.net core cookie)

我想在web api中创建一个演示登录服务,需要在响应中设置一个cookie.我怎么做?还是有更好的方式来做授权?

解决方法

添加对System.Net.Http.Formatting.dll的引用,并使用HttpResponseHeadersExtensions类中定义的AddCookies扩展方法.

这是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中显示

.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

.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 Register(AllenRegistration model)

{

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(new
                {
                    return1="A",

                    return2="B"
                }, Configuration.Formatters.JsonFormatter)
            };
        }


asp.net core WebApi 返回 HttpResponseMessage

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 Core, ASP.NET WebApi

 

 

asp.net – .NET Web API HttpResponseMessage模式?

asp.net – .NET Web API HttpResponseMessage模式?

所以我看到Web API 2控制器返回HttpResponse和实际对象.例:
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#?

解决方法

请参阅 this和 this SO问题.

两种情况下的响应都是相同的(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模式?的相关信息,请在本站寻找。

本文标签: