2016-11-21 3 views
0

Я использую .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

enter image description here

+0

Не вы просто используете другой идентификатор (** id2 ** против ** se_id **), или это просто опечатка в вопросе? Вы проверили заголовки ответов, отправленные в браузер/скрипку/что-то еще? Я пробовал 1.1 и не испытывал проблем с настройкой файлов cookie в контроллере, используя 'Response.Cookies.Append' так же, как вы делали –

+0

@ DanielJ.G. это не опечатка, я просто попытался создать файл cookie agitato и прочитать старый, я не смог прочитать уже сделанный, и не мог создать новый, я проверил в инструменте разработчика браузера, cookie 'id2', никогда не получал создать , можете ли вы поделиться со мной своим тестовым файлом, который работал с вами, как почтовая папка, поэтому я заглядываю в нее, может ли это помочь что-то сделать неправильно. Спасибо –

+0

Я создал новый проект в VS, обновлен до версии 1.1 и использовал почти ваш контроллер. Проверьте [этот смысл] (https://gist.github.com/DaniJG/ac1e54579985efe96718fc70b0f1a069) –

ответ

0

я нашел принципы этого post, где вопрос выглядит, связано с запросом во внешнем файле HTML, а не программирования контроллера, и, как упоминалось here:

XmlHttpRequest ответов из другого домена не могут установить cookie значения для своего домена, если withCredentials не установлен истине, прежде чем сделать запрос, независимо от Access-Control- заголовка значения

В моем коде, он работал после добавления credentials: 'include' к fetch поэтому мой исходный код стал как:

fetch('http://localhost:60000/api/Resins', { 
     credentials: 'include', 
     method: 'get' 
}).then(function(response) { 
     return response.json(); 
}).then(function(returnedValue) { 
     var asdf = returnedValue; 
     console.log(asdf); 
}).catch(function (err) { 
    console.log(JSON.stringify(err)); 
}); 

и печенье теперь могут быть считаны из контроллера, хотя в средстве разработки браузера, до сих пор можно увидеть под network -> Cookies и ничего появляющегося под Application -> cookies.

enter image description here

Смежные вопросы