Невозможно заставить CORS работать в Visual Studio (работает на двух серверах DEV, не работает на двух серверах TEST) - PullRequest
0 голосов
/ 30 марта 2020

У нас есть разделенные серверы - WEBAPI на отдельном сервере. Я установил, что мое приложение работает на разных серверах в DEV, но я перенес один и тот же код на пару серверов TEST, и он не работает. Я не могу понять, почему. Кажется, что с сервером TEST WebApi должно быть что-то иное, но я не знаю, где искать, и у меня нет доступа к нему, чтобы заглянуть под капот, не попросив системных людей сделать это для меня.

Используемое программное обеспечение: Visual Studio 2017, C#, Javascript, HTML / CSS, Oracle, Entity Framework 6, Breeze, IIS 10

Я установил пакеты NuGet: Microsoft.As pNet .WebApi.Cors 5.2.7 и Microsoft.AspNetCore. Mvc .Cors 2.2.0.

В моем \ WebAPI \ App_Start \ WebApiConfig.cs я добавил EnableCors:

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services
    config.EnableCors();

    // Web API routes
    config.MapHttpAttributeRoutes();

И в моих контроллерах BREEZE и MVC я добавил EnableCors с 3 источниками для сред DEV, TEST и PREPROD (я обнаружил, что наличие атрибута [Authorize] заставляет его не работать). Пришлось это прокомментировать):

using System.Web.Http.Cors;

namespace SCC.WebAPI.Controllers
{
    //[Authorize]    
    [BreezeController]
    [EnableCors(origins: “http://webdevint.scc.state.va.us,http://in.scctest2new.scc.state.va.us,http://in.sccpreweb5.scc.state.va.us", headers: "*", methods: "*")]
    public class LookupController : ApiController
    {

DEV работает, TEST - нет.

В DEV - я получаю заголовок Access-Control-Allow-Origin, требуемый CORS:

Источник (в моих EnableCors): сервер WEBDEVINT -> Webapi: сервер SCCDEVCS * 10 17 *

enter image description here

В ТЕСТЕ - я получаю ошибку:

Источник (в моих EnableCors): сервер SCCTEST2NEW -> Webapi: сервер SCCTESTAPP

ERROR: “Access to XMLHttpRequest at 'http://scctestapp.scc.state.va.us/EFIWEBAPI/breeze/Lookup/Metadata' from origin 'http://in.scctest2new.scc.state.va.us' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.”

Если я вставляю URL, он пытается попасть в адресную строку: 'http://scctestapp.scc.state.va.us/EFIWEBAPI/breeze/Lookup/Metadata',

, он работает просто отлично. Возвращает метаданные. Поэтому я знаю, что запрашиваемый URL-адрес правильный.

Примечание. Я также попробовал следующее в своих контроллерах, и оно не работало по-другому - я знаю, что это немного угрожает безопасности, позволяющей запускать любой сервер. сообщения:

[EnableCors(origins: "*", headers: "*", methods: "*")]

Кажется, что на сервере TEST есть что-то отличное от сервера DEV. Но у меня два веб-приложения (UI и WebAPI) были настроены в IIS одинаково для DEV и TEST.

Может быть, это настройка IIS, которую нужно установить? Может ли это быть что-то в GA C? Я не знаю, с чего начать. Спасибо за любой совет.

Редактировать: я также попытался добавить следующие строки в web.config WebAPI с и без строки Credentials:

  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="http://in.scctest2new.scc.state.va.us" />
        <add name="Access-Control-Allow-Headers" value="*" />
        <add name="Access-Control-Allow-Methods" value="*" />
        <add name="Access-Control-Allow-Credentials" value="true" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>

Но это дает мне 401 Unauthorized on вызов метаданных. Не уверен, какие учетные данные он ищет.

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Здесь код для класса контроллера

[EnableCors(origins: "*", headers: "*", methods: "*")]
    public class LienThongController : ApiController

и есть функция

 [EnableCors(origins: "*", headers: "*", methods: "*")]
        [HttpGet]
        [Route("Unit/getList")]
        public IHttpActionResult getListUnitLienThong()

Web API Config

 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            config.EnableCors(); 
            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
0 голосов
/ 30 марта 2020

в Startup.cs задает что-то подобное

  app.Use(async (context, next) =>
            {
                //context.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN");
                await next.Invoke();
            });
            app.UseCors(
              options => options.WithOrigins("http://117.1.16.24",
                            "http://10.47.102.60",
                            "http://10.47.102.61",
                            "http://10.47.102.62",
                            "http://10.47.102.63")
                          .AllowAnyOrigin()
                          .AllowAnyHeader()
                          .AllowAnyMethod()
                          .AllowCredentials()
            );
...