AddCors не показывает никаких заголовков для Access-Control-Allow-Origin ASP.NET - PullRequest
0 голосов
/ 18 января 2020

Я новичок ie в ASP. NET со второй попыткой кодирования. NET, поэтому, пожалуйста, будьте терпеливы со мной и благодарим вас за помощь в первом проекте. Следующий проект представляет собой попытку создать. NET API, который будет только GET JSON для приложения React для отображения данных и разбитых на страницы данных.

Как гласит заголовок, я не вижу Access- Control-Allow-Origin в разделе заголовка инструментов разработчика - см. Прикрепленный снимок экрана.

json-header within developer tools

Как видно из предыдущего снимка экрана, он работает, как и ожидалось, за исключением того, что заголовки ничего не показывают относительно Access-Control-Allow-Origin, что заставляет мое приложение реакции выдавать ошибку «SyntaxError: Неожиданный конец ввода» - когда я помещаю JSON внутри файла и заставьте приложение реагировать получить локальный файл. json, все работает как положено, что подтверждает, что проблема не связана с получением «Access-Control-Allow-Origin» в заголовках. Следующий код - мой файл Startup.cs, который использует MySql для извлечения данных.

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace v2
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(options =>
                options.AddPolicy("AllowSpecific", p => p.WithOrigins("http://localhost:3006")
                                                        .WithMethods("GET")
                                                        .WithHeaders("name")));
            services.AddMvc(option => option.EnableEndpointRouting = false);
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });


            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);

            //MySql
            services.AddTransient<MySqlDatabase>(_ => new MySqlDatabase("server=xyz.com; database=someDB; uid=someUser; pwd=somePwd; port=somePort;"));
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.EnvironmentName == "dev")
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }
            app.UseCors(builder =>
                builder.WithOrigins("http://localhost:3006")
                        .AllowAnyHeader()
                );
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");

                routes.MapRoute(
                    name: "OrderItem",
                    template: "OrderItem/{div?}/{yr?}",
                    defaults: new { controller = "OrderItem", action = "Index" });
            });
        }
    }
}

Чтобы JSON отображался без каких-либо тегов html, это было достигнуто благодаря наличию только @ResponseBody в _Layout и @ HTML .raw (JSON .parse (Model). )) на странице OrderItem / Index.cs html.

В PHP я бы использовал что-то вроде следующего для отображения Access-Control-Allow-Origin в заголовках:

  header("Access-Control-Allow-Origin: *");
  header("Access-Control-Allow-Headers: Content-Type");
  header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
  header("Content-Type: application/json; charset=UTF-8");

Должен ли я сделать нечто подобное на страницах _Layout и cs html?

Еще один момент, я не смогу опробовать ваши предложения, пока не вернусь к работе в понедельник, но как обычно, заранее спасибо, и я ценю вашу помощь

1 Ответ

0 голосов
/ 21 января 2020

Оказывается, мне нужно было добавить класс атрибута, плюс он был доступен для всего контроллера

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web.Http.Filters;

namespace v2
{
    public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            if (actionExecutedContext.Response != null)
                actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "http://localhost:3006");

            base.OnActionExecuted(actionExecutedContext);
        }
    }
}

Затем добавили это в OrderItemController:

using Microsoft.AspNetCore.Mvc;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using dto = v2.Models;
using mFilter = v2.AllowCrossSiteJsonAttribute;

namespace v2.Controllers
{
    [AllowCrossSiteJson]

Пока я действительно видел подобный пост с этим ответом, я не мог заставить его работать, пока я не добавил:

using mFilter = v2.AllowCrossSiteJsonAttribute;

, который сделал его доступным для всего контроллера, добавив:

[AllowCrossSiteJson]

под пространством имен и над классом контроллера

Извините, снимок экрана отсутствует, я отправил электронное письмо со снимком экрана с работы, но система, должно быть, заблокировала его при поступлении.

Как обычно, заранее спасибо, и спасибо @KirkLarkin за указание на то, что просто просмотр заголовков с localhost: 5001 не доказывает, что он не отвечает с заголовками, которые я хотел увидеть, что приводит меня к просмотру заголовков из React localhost приложения: перспектива 3006.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...