Я мог бы действительно помочь с этим. В двух словах, я пытаюсь сделать запрос междоменного (CORS) из локально размещенного приложения Cordova в веб-API ASP.NET, который также размещается локально. Проблема заключается в том, что мое клиентское приложение и веб-API используют разные порты, поэтому требуется поддержка CORS. Я пробовал несколько разных вещей, чтобы обойти это, но пока не повезло. Вот некоторые особенности:Предварительная проверка CORS с SessionAuthenticationModule
- Приложение My Cordova построено с помощью VS Tools для Apache Cordova и работает в Chrome через эмулятор Ripple. Проблема здесь в том, что эмулятор автоматически назначает порт, и я не могу найти способ его переопределить. Другими словами, если я могу изменить порт в соответствии с тем, который используется для моего веб-API, я могу временно ограничить ограничение CORS.
- My Web API является CORS с поддержкой с помощью ссылки на System.Web.Http.Cors и следующий код запуска:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
var cors = new EnableCorsAttribute("*", "*", "*"); // note: the '*' values are temporary for testing purposes
config.EnableCors(cors);
}
}
Мой клиент приложение выдавшего запрос предварительной проверки, так как мой тип содержимого требуется для приложения/json. Попытка добавить флаг withCredentials, установленный в true, не имеет эффекта - то есть мой токен-носитель никогда не отправляется во время запроса предполетной проверки.
Мой веб-интерфейс защищен с помощью Windows Identity Foundation. В частности, у меня есть пользовательский SessionAuthenticationModule, который проверяет каждый запрос независимо от того, связан ли он с CORS. У меня был ограниченный успех, пытаясь настроить модуль (ниже) таким образом, что я могу заставить его принять запрос перед полетом, но последующий POST из моего клиентского приложения никогда не отправляется. Должен ли я запускать эту логику асинхронно?
public class CustomSessionAuthenticationModule : SessionAuthenticationModule
{
private const string AccessControlRequestHeaders = "Access-Control-Request-Headers";
private const string AccessControlAllowHeaders = "Access-Control-Allow-Headers";
private const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
private const string Origin = "Origin";
protected override void InitializeModule(HttpApplication context)
{
base.InitializeModule(context);
context.BeginRequest += ApplicationOnBeginRequest;
}
private static void ApplicationOnBeginRequest(object sender, EventArgs e)
{
var application = (HttpApplication)sender;
if (application.Request.Headers.AllKeys.Contains("Origin") && application.Request.HttpMethod == HttpMethod.Options.ToString())
{
application.Response.StatusCode = (int)HttpStatusCode.OK;
application.Response.Headers.Add(AccessControlAllowOrigin, application.Request.Headers.GetValues(Origin).First());
string requestedHeaders = string.Join(", ", application.Request.Headers.GetValues(AccessControlRequestHeaders));
if (!string.IsNullOrEmpty(requestedHeaders))
{
application.Response.Headers.Add(AccessControlAllowHeaders, requestedHeaders);
}
}
}
}
Спасибо всем за любые предложения, которые вы можете предложить, которые могли бы помочь решить эту проблему.