将标头cookie从Web API帖子传递到标题位置页面

时间:2017-07-28 08:09:42

标签: c# cookies asp.net-web-api

我有一个从外部源发布的ASP.Net Web API。发布到Web API的值用于确定用户在我们网站上的权限。所以web api然后将我的业务逻辑的结果对象作为一堆cookie传递给我们的asp登陆页面。问题是网页api路由响应的网页中不再提供cookie。

这是web api:

    [HttpPost]
    public HttpResponseMessage Reports(ReportRequest reportRequest)
    {
        if (reportRequest != null)
        {
            var reportAccess = new SwitchBL().CheckUserAccess(reportRequest);

            var response = Request.CreateResponse(HttpStatusCode.Moved);
            response.Headers.Location = new Uri(BaseUrl() + "/menu.aspx");

            var json = JsonConvert.SerializeObject(reportAccess);
            Dictionary<string, string> biscuitTin = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);

            foreach (var biscuit in biscuitTin)
            {
                var cookie =
                    new CookieHeaderValue(biscuit.Key, biscuit.Value ?? "")
                    {
                        Expires = DateTimeOffset.Now.AddDays(1),
                        Domain = Request.RequestUri.Host == "localhost" ? null : Request.RequestUri.Host,
                        HttpOnly = true
                    };
                //cookierJar.Add(cookie);
                response.Headers.AddCookies(new CookieHeaderValue[] {cookie} );
            }
            return response;
        }
        return Request.CreateResponse(HttpStatusCode.BadRequest);
    }

到目前为止,我非常简单的aspx页面总是显示count = 0:

public partial class menu : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        var cookieCount = Request.Cookies.Count;
    }
}

web api和aspx页面位于同一个项目中,因此托管在一个站点中。我不想使用会话变量,也不想在查询字符串中传递值。是否有另一种方法将数据从web api传递到路由页面,或者我在这里遗漏了什么?

顺便说一句,如果我使用Postman发布到api,cookie会在web api的响应头中显示,因此会创建cookie。如果我使用其他网页发布,使用Fiddler,我可以在api的响应中看到cookie,但是(接收)asp页面中没有cookie。

更新 感谢Kai的回答,我现在可以在我的路径asp页面中获取cookie,如在response.Headers.Location中设置的那样。我在该页面中有一个断点,所以我知道它正在被击中,cookie计数现在正如预期的那样。但是,浏览器不会呈现路由页面。它保留在原始发布页面上。以下是我在帖子模拟器页面中使用的代码,用于调用web api:

protected void Page_Load(object sender, EventArgs e)
{

}

protected async void DoIt_OnClick(object sender, EventArgs e)
{
    var reportRequest = new ReportRequest();
    reportRequest.EmailAddress = Email.Text;
    reportRequest.UserNumber = UserCode.Text;
    reportRequest.MobileNumber = MobileNumber.Text;
    reportRequest.Password = Password.Text;
    reportRequest.Country = Country.Text;
    reportRequest.AccountNumber = AccountNumber.Text;
    reportRequest.AccountType = AccountType.Text;
    reportRequest.ReportType = ReportType.Text == "" ? 0 : Convert.ToInt32(ReportType.Text);
    reportRequest.PhoneInfo = PhoneInfo.Text;

    await GoThereAsync(reportRequest);

}

public async Task<Uri> GoThereAsync(ReportRequest reportRequest)
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri("http://localhost:7789/");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain"));

        var response = await client.PostAsJsonAsync<ReportRequest>("api/switch/reports", reportRequest);

        if (response.IsSuccessStatusCode)
        {
            return response.RequestMessage.RequestUri;
        }
        return null;
    }
}

总结一下:Emulator.aspx对web api进行POST。 Web API将cookie和位置设置为home.aspx。 Home.aspx接收cookie(调试步骤进入代码隐藏)但浏览器仍然在Emulat.aspx上,并且不呈现home.aspx。

1 个答案:

答案 0 :(得分:1)

尝试CookieHeaderValue.Path = "/"

来自Microsoft Docs

  

路径:将cookie限制为域内指定的路径。如果未指定,则使用请求URI的路径。