Amr Mohammad Rashad Ответов: 0

Asp.net проблема web API CORS


I am facing a CORS policy problem and I do not know how to fix it. I tried many approaches but what makes me crazy is that the service works fine on some devices and I can utilize all its resources and works a little bit on others and does not work at others while the whole devices having the same configuration equally set. To be more clear I am having a Web application based entirely and only on AngularJS 2 and a Web API that exposes a few actions. I installed the IIS and hosted the Web API on the default Web Site, which means it can be called from port 80 for simplicity, and I hosted the Web application using port 4200. Now let's give more detail about my Web API application structure.

ЭЛЕКТРОМИОГРАММА.Веб-API.Ядро -> этот проект является основным проектом, в который я помещаю классы контроллеров и класс веб-конфигурации
ЭЛЕКТРОМИОГРАММА.WebApi.WebHost -этот проект используется только для хостинга и содержит ссылку на ЭМГ.Веб-API.Основной проект и есть тот, который содержит Global.asax и в его Application_Start я вызываю метод Register класса конфигурации WebApi.Ядро и дать ему в качестве параметра объект GlobalConfiguration для регистрации моих обработчиков, трассировщиков и т. д.

using EMG.ElectrometerWS.WebApi.Core;
using System;
using System.Web.Http;
using EMG.ElectrometerWS.WebApi.Core.Configuration;

namespace EMG.ElectrometerWS.WebApi.WebHost
{
    public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            GlobalConfiguration.Configuration.EnsureInitialized();
        }
    }
}


using EMG.ElectrometerWS.WebApi.Core.Handlers;
using EMG.ElectrometerWS.WebApi.Core.Tracer;
using System;
using System.Configuration;
using System.Web.Http;
using System.Web.Http.Cors;
using System.Web.Http.Tracing;

namespace EMG.ElectrometerWS.WebApi.Core.Configuration
{
    public static class WebApiConfig
    {
        ...

        public static string CorsOrigin
        {
            get
            {
                string result = ConfigurationManager.AppSettings.Get("CorsOrigin");
                if (!string.IsNullOrEmpty(result))
                {
                    return result;
                }
                throw new Exception("AppSetting CorsOrigin not found in web.config file.");
            }
        }
        public static void Register(HttpConfiguration config)
        {

            // Web API configuration and services
            EnableCorsAttribute enableCors =
               new EnableCorsAttribute(CorsOrigin, "*", "*");
            config.EnableCors(enableCors);
            // Web API routes
            config.MapHttpAttributeRoutes();            
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            //config.Routes.MapHttpRoute(
            //    name: "Secret Api",
            //    routeTemplate: "secretapi/{controller}/{id}",
            //    defaults: new { id = RouteParameter.Optional },
            //    constraints: null,
            //    handler: new ApiKeyProtectionMessageHandler() {
            //        InnerHandler = new HttpControllerDispatcher(config)
            //    });

            // Enable ASP.NET Web API tracing
            //config.EnableSystemDiagnosticsTracing();
            //config.Services.Replace(typeof(ITraceWriter), new EntryExitTracer());
            //config.Services.Replace(typeof(ITraceWriter), new WebApiTracer());
            

            //config.MessageHandlers.Add(new EmptyPostBodyMessageHandler());
            // Message handler to check the performance in production environment ONLY
            config.MessageHandlers.Add(new TracingHandler());
            //config.MessageHandlers.Add(new XHttpMethodOverrideHandler());
            config.MessageHandlers.Add(new JwtHandler());
        }
    }
}


ЭМГ.Электрометры.Веб-API.Веб-Хостинг-Провайдера.Cofig

<appSettings>
   ....
   <add key="CorsOrigin" value="http://localhost:4200"/>
 </appSettings>


Что меня сводит с ума, так это то, что все прекрасно работает на ноутбуке моего коллеги, и он может использовать все действия. На моем я не могу вызвать некоторые из методов PUT, в то время как я могу для других на других коллегах/тестировщиках они могут вызвать только методы GET!!! И еще больше меня удивляет то, что после очистки истории браузера/файлов cookie один из тех ноутбуков, которые имеют только вызываемые методы GET, все работает нормально.

Что я уже пробовал:

Я перепробовал много подходов

EnableCorsAttribute enableCors =
               new EnableCorsAttribute(CorsOrigin, "*", "*");
            config.EnableCors(enableCors);


Создание следующего обработчика и регистрация его в качестве первого обработчика перед другими обработчиками

public class CorsPreflightHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
if (request.Headers.Contains("Origin") && request.Method == HttpMethod.Options)
{
var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Headers.Add("Access-Control-Allow-Origin", "*");
response.Headers.Add("Access-Control-Allow-Methods", "*");

return response;
}
return await base.SendAsync(request, cancellationToken);
}
}


Удаление предыдущего кода и настройка CORS с помощью файла Web.config проекта WebHost

<system.webServer>
     <httpProtocol>
         <customHeaders>
            <add name="Access-Control-Allow-Origin" value="http:localhost:4200" />
            <add name="Access-Control-Allow-Methods" value="*" />
            <add name="Access-Control-Allow-Headers" value="*" />
         </customHeaders>
     </httpProtocol>
</system.webServer>


Наконец удаление тегов web config и включение if на каждом классе контроллера

[EnableCors(origins: "http://localhost:4200", headers: "*", methods: "*")]
    public class XXXController : ApiController
    {
       Public string Get(int id)
       {
           return "value";
       }
    }

j snooze

не знаю, поможет ли вам это, но я использую .net core, у меня есть это. в моем startup.cs


// Этот метод вызывается средой выполнения. Используйте этот метод для добавления служб в контейнер.
public void ConfigureServices(службы IServiceCollection)
{

услуги.Аддкоры();
услуги.AddMvc();
услуги.Настройка<iisoptions>(options => { options.ForwardWindowsAuthentication = истина; });
var appSettings = конфигурация.GetSection("AppSettings");
услуги.Настроить<wtsprinters.модели.параметр appsettings&ГТ;(параметр appsettings);
}

// Этот метод вызывается средой выполнения. Используйте этот метод для настройки конвейера HTTP-запросов.
public void Configure(приложение IApplicationBuilder, IHostingEnvironment env, ILoggerFactory loggerFactory)
{

// Показывает UseCors с именованной политикой.
приложение.UseCors(построитель => у застройщика.WithOrigins("*")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());

app.UseMvc(маршруты =>
{
маршруты.MapRoute(
имя default",
шаблон: "api/{controller}/{action}/{id?}");
});
}
}

j snooze

Тем не менее, я чувствую вашу боль, я боролась предполетной течение нескольких часов. Веселое время.

Amr Mohammad Rashad

К сожалению, я не использую Core framework :(. Я видел много решений и перепробовал почти все из них, но у меня было много проводных рабочих/не рабочих ситуаций. Кроме того, я добавил свой собственный обработчик веб-токенов json и не использую тип аутентификации токенов OWIN, так как я ничего не знаю о OWIN и у меня нет времени на расследование, так как мы должны представить клиенту какую-то демонстрацию, иначе мы потеряем тендер :(.

Amr Mohammad Rashad

Является ли мой вопрос загадкой или может быть решение?

j snooze

Я не знаю. Большинство моих проблем заключалось в том, что я только изучал cors с точки зрения angular2/.net core. У меня был свой angular2, передающий учетные данные, но в конечном итоге мне пришлось разрешить анонимную аутентификацию для предполетной подготовки. Это было всего лишь приложение интрасети, и я использовал аутентификацию windows для фактического вызова, но все равно должен был включить анонимность для предполетной подготовки. Возможно, не в вашей ситуации, но это была моя дилемма.

Amr Mohammad Rashad

Я с помощью проверки подлинности (т. е. JSON веб-маркеры), а мой механизм аутентификации. Я добавил свой обработчик сообщений Jwt, и он просто отлично работает для меня. Существует также версия OWIN такого механизма аутентификации, но я не знаю о нем. Теперь Корс отлично работает для меня! используя первый вышеописанный подход, добавьте новый параметр приложения в web.config службы и зарегистрируйте его с помощью config.EnableCors(enableCors) однако я точно не знаю, в чем проблема, почему он не работал раньше? Может быть, это связано с IIS или это был Front-End неверных URL-адресов?

0 Ответов