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-адресов?