スティーブの回答私、私が原因クレジットを与えていないため、事前に謝罪しますそれは必然的に私の場合の解決につながりました。それが私がそれに投票した理由です。しかし、HttpHandlerは明示的に必要ではないようです。だから私はCORSを厳密にリクエストパイプラインに接続するモジュール自体に組み込んだ。私のコード:
using System;
using System.Web;
namespace NAMESPACE.HttpModules
{
public class CrossOriginModule : IHttpModule
{
public String ModuleName
{
get { return "CrossOriginModule"; }
}
public void Init(HttpApplication application)
{
application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
}
private void Application_BeginRequest(Object source, EventArgs e)
{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
string httpMethod = context.Request.HttpMethod.ToUpper();
//preflight
if (httpMethod == "OPTIONS")
{
ClearResponse(context);
//Set allowed method and headers
SetAllowCrossSiteRequestHeaders(context);
//Set allowed origin
SetAllowCrossSiteRequestOrigin(context);
//end request
context.ApplicationInstance.CompleteRequest();
}
else
{
SetAllowCrossSiteRequestOrigin(context);
}
}
static void SetAllowCrossSiteRequestHeaders(HttpContext context)
{
string requestMethod = context.Request.Headers["Access-Control-Request-Method"];
context.Response.AppendHeader("Access-Control-Allow-Methods", "GET,POST");
//We allow any custom headers
string requestHeaders = context.Request.Headers["Access-Control-Request-Headers"];
if (!String.IsNullOrEmpty(requestHeaders))
context.Response.AppendHeader("Access-Control-Allow-Headers", requestHeaders);
//allow credentials
context.Response.AppendHeader("Access-Control-Allow-Credentials", "true");
}
static void SetAllowCrossSiteRequestOrigin(HttpContext context)
{
string origin = context.Request.Headers["Origin"];
if (!String.IsNullOrEmpty(origin))
context.Response.AppendHeader("Access-Control-Allow-Origin", origin);
else
context.Response.AppendHeader("Access-Control-Allow-Origin", "*");
}
static void ClearResponse(HttpContext context)
{
context.Response.ClearHeaders();
context.Response.ClearContent();
context.Response.Clear();
}
public void Dispose()
{
}
}
}
そして、あなたのweb.config
<modules runAllManagedModulesForAllRequests="true">
<add name="CrossOriginModule" preCondition="managedHandler" type="NAMESPACE.HttpModules.CrossOriginModule" />
</modules>
にこれは、必要に応じてレスポンスヘッダを設定し、それは通常どおりMVCは要求を処理できるようになります。
ウェブサービスにページロードイベントがないため、何を意味するのか不明です。通常、Webサービスはwebmethod属性を持つ単一の関数です。 http://msdn.microsoft.com/en-us/library/system.web.services.webservice.aspx – Hogan
「サービス」を混乱させてご利用いただきありがとうございます。それは、POSTを受け付けるページを持つウェブサイトです。私はそれがaspxのページである必要はないことを理解しますが、それは簡単に変更することができないように既にそれにリンクしている野生のページがあります。 – ari