C# 停止对cookies.Append()进行编码。dotnetcore 2.0

C# 停止对cookies.Append()进行编码。dotnetcore 2.0,c#,asp.net,asp.net-mvc,.net-core,owin,C#,Asp.net,Asp.net Mvc,.net Core,Owin,我们正在构建一个dotnetcore 2.0 web应用程序,该应用程序通过http从遗留系统接收cookies,并在响应中设置cookies 调试应用程序时,我可以看到cookie.value不是url编码的,但在调用append之后,设置的cookie头是url编码的。这是有问题的,因为旧版cookie需要在旧版应用程序按原样读取时取消编码 public static void AddCookie(this IResponseCookies cookies, Cookie cooki

我们正在构建一个dotnetcore 2.0 web应用程序,该应用程序通过http从遗留系统接收cookies,并在响应中设置cookies

调试应用程序时,我可以看到
cookie.value
不是url编码的,但在调用append之后,设置的cookie头是url编码的。这是有问题的,因为旧版cookie需要在旧版应用程序按原样读取时取消编码

    public static void AddCookie(this IResponseCookies cookies, Cookie cookie)
    {
        cookies.Append(cookie.Name, cookie.Value, new CookieOptions
        {
            Domain = cookie.Domain,               
            Expires = cookie.Expires == DateTime.MinValue ? null : (DateTimeOffset?) cookie.Expires,
            HttpOnly = cookie.HttpOnly,
            Path = cookie.Path,
            Secure = cookie.Secure
        });
    }
有没有办法防止它们被编码?某处的旗帜或布景

我尝试编写owin中间件,但set cookie头始终为空

public class CookieDecode
{
    private readonly RequestDelegate _next;

    public CookieDecode(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        var x = context.Response.Headers;
        var y = x["set-cookie"];
        //y is always empty
        await _next.Invoke(context);
    }
}

想法?

不,没有避免URL编码的选项。然而,中国正在这样做。你能试着用同样的方法手动设置标题吗

    public void Append(string key, string value, CookieOptions options)
    {
        if (options == null)
        {
            throw new ArgumentNullException(nameof(options));
        }

        var setCookieHeaderValue = new SetCookieHeaderValue(
            Uri.EscapeDataString(key),
            Uri.EscapeDataString(value))
        {
            Domain = options.Domain,
            Path = options.Path,
            Expires = options.Expires,
            MaxAge = options.MaxAge,
            Secure = options.Secure,
            SameSite = (Net.Http.Headers.SameSiteMode)options.SameSite,
            HttpOnly = options.HttpOnly
        };

        var cookieValue = setCookieHeaderValue.ToString();

        Headers[HeaderNames.SetCookie] = StringValues.Concat(Headers[HeaderNames.SetCookie], cookieValue);
    }

您可能还可以添加一个扩展方法。让它静止,给它一个新的名字,然后去掉逃逸。该类是Microsoft.AspNetCore.Http.Internal.ResponseCookies这看起来很完美,但是SetCookieHeaderValue在传递未编码的值时抛出异常。但是根据你的建议,我发现了一个类似的解决方案,它不使用SetCookieHeaderValue,所以很高兴给你一个正确的答案。@MarkVickery,这个答案适用于Web API。因为我在那里没有看到
AppendValues
方法。你们是怎么解决的?@mohammadrostamisiahgeli我只是用header.Append(“Set Cookie”)来代替。