Я использую .NET CORE 1.1.0
смог назначить и читать печенье из middleware
как:Присвоить печенье из контроллера внешнего файла HTML
app.Run(async context =>
{
context.Response.Cookies.Append("se_id","5");
Console.WriteLine(context.Request.Cookies["se_id"]);
await _next.Invoke(context);
});
Но когда я попытался сделать то же самое с Controller
я не получил что-то сделано, cookie не написан и не читается.
Я пытался в контроллере использовать ниже, а также, но не получилось:
namespace ApiCall.Controllers
{
[Route("api/[controller]")]
public class FetchController : Controller
{
[HttpPost]
public JsonResult Post([FromBody]object loginParam)
{
Response.Cookies.Append("id2","8");
Console.WriteLine(Request.Cookies["se_id"]);
}
}
}
В чем разница между обработки печенье в middleware
и обращении с ним в controller
UPDATE
Я обновил свой код на основе отзывов, приведенных в комментариях, я заметил следующее: 1. Контроллер записывает t o запрос, поступающий с сервера. 2. Контроллер не писал на запрос, который идет от External
файла
обновленный код, который я есть:
controller.cs
:
using System; // for Console.WriteLine
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc; // for Controller, [Route], [HttpPost], [FromBody], JsonResult and Json
namespace server
{
[Route("api/[controller]")]
public class ResinsController : Controller{
[HttpGet]
public JsonResult Get(){
#region
var result = new List<Item>();
result.Add(new Item{Code = "320"});
#endregion
Response.Cookies.Append("id2", "8");
Console.WriteLine(Request.Cookies["id2"]);
return Json(result);
}
}
public class Item{
public string Code { get; set; }
}
}
Приведенный выше код работает отлично, один раз Я называю это от http://localhost:60000/api/Resins
Но не работает, когда я вызываю его из внешнего файла, внешний файл является рабочим файлом в терминах fetch
, поскольку я получил возвращенный v ALUE, и может видеть его в concole, что не работает в обработке cookies
, мой index.html
является:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<h2>
Test page for using ajax call in webapi core.
</h2>
<button onclick="useFetch()">Use Fetch</button>
<script type="text/javascript">
function useFetch() {
fetch('http://localhost:60000/api/Resins', {
method: 'get'
}).then(function(response) {
return response.json();
}).then(function(returnedValue) {
var value = returnedValue;
console.log(value);
}).catch(function (err) {
console.log(JSON.stringify(err));
});
}
</script>
</body>
</html>
при необходимости, файл program.cs
является:
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Hosting; // for WebHostBuilder()
namespace server{
public class Program{
public static void Main(string[] args){
Console.WriteLine("Hello World!");
#region Define Host
var host = new WebHostBuilder()
.UseKestrel()
.UseUrls("http://localhost:60000", "https://localhost:60001")
.UseStartup<Startup>() // Startup is the class name, not the file name
.Build();
#endregion
host.Run();
}
}
}
файл startup.cs
является:
using Microsoft.Extensions.DependencyInjection; // for IServiceCollection
using Microsoft.AspNetCore.Builder; // for IApplicationBuilder and FileServerOptions
using Microsoft.AspNetCore.Hosting; // for IHostingEnvironment
namespace server{
public class Startup{
public void ConfigureServices(IServiceCollection services){
services.AddCors(); // to be accesssed from external sites, i.e. outside the server
services.AddMvc(); // to use Controllers, Add framework services.
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env){
app.UseCors(builder => // to be accesssed from external sites, i.e. outside the server
builder.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
);
app.UseMvc();
}
}
}
и файл project.json
является:
{
"version": "1.0.0-*",
"buildOptions": {
"debugType": "portable",
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
"Microsoft.AspNetCore.Mvc": "1.1.0"
},
"frameworks": {
"netcoreapp1.1": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.1.0"
}
},
"imports": "dnxcore50"
}
}
}
UPDATE 2
При проверке различных экранов в browser developer tool
, я обнаружил, что прилагается: 1. упомянуть Application
экран явно нет печенья, 2.Network
->Cookies
экран ШОС куки были написаны правильно, но контроллер не может прочитать его обратно, что означает, что контроллер пытается прочитать куки из Application cookies
не из Network cookies
Не вы просто используете другой идентификатор (** id2 ** против ** se_id **), или это просто опечатка в вопросе? Вы проверили заголовки ответов, отправленные в браузер/скрипку/что-то еще? Я пробовал 1.1 и не испытывал проблем с настройкой файлов cookie в контроллере, используя 'Response.Cookies.Append' так же, как вы делали –
@ DanielJ.G. это не опечатка, я просто попытался создать файл cookie agitato и прочитать старый, я не смог прочитать уже сделанный, и не мог создать новый, я проверил в инструменте разработчика браузера, cookie 'id2', никогда не получал создать , можете ли вы поделиться со мной своим тестовым файлом, который работал с вами, как почтовая папка, поэтому я заглядываю в нее, может ли это помочь что-то сделать неправильно. Спасибо –
Я создал новый проект в VS, обновлен до версии 1.1 и использовал почти ваш контроллер. Проверьте [этот смысл] (https://gist.github.com/DaniJG/ac1e54579985efe96718fc70b0f1a069) –