我有一个从外部源发布的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。
答案 0 :(得分:1)