我真的可以使用这个帮助。简而言之,我试图从本地托管的Cordova应用程序向本地托管的ASP.NET Web API发出跨域(CORS)请求。挑战在于我的客户端应用程序和Web API都使用不同的端口,因此需要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);
}
}

我的客户端应用程序正在发出预检请求,因为我的内容类型需要是application / json。尝试将withCredentials标志设置为true无效 - 即在预检请求期间永远不会发送我的承载令牌。
我的Web API通过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);
}
}
}
}

感谢所有您提供的可能有助于解决此问题的建议。
答案 0 :(得分:0)
为了其他可能遇到类似问题的人的利益,我通过解决方法取得了一些进展。这就是我的所作所为:
更新2015年12月12日: 缺少的部分是将以下条目添加到web.config中的system.web的授权部分:
<allow verbs="OPTIONS" users="*" />
只要自定义SAM回退到预检请求的基本OnAuthenticateRequest方法,那么一切都能正常工作。