ASP.NET에서 특정 요청에 동적으로 HTTP 헤더를 설정하는 방법
8816 단어 CORS아 SP. 네 TmoduleHttpHeader
개요
모든 요청에 Header를 추가하는 경우 Web.config에 를 추가하면 됩니다. 그러나 요청에 따라 헤더를 설정하려는 경우에는 사용할 수 없습니다.
Web.config<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
View를 돌려주는 Controller로 Header를 추가하면 끝나는 이야기입니다만, 일일이 추가하는 것은 그다지 깨끗하지 않고 위에 정적으로 전달하는 파일에 대해서는 유효하지 않습니다.
이번은 Module을 이용해 요청마다 실행되는 이벤트를 작성함으로써 이용하여 실현합니다.
Module이란?
Module을 사용하면 각 요청의 중간 단계에서 처리를 인터럽트 할 수 있습니다. 이를 통해 요청에 대해 특정 동작을 수행할 수 있습니다.
소스 코드
using System;
using System.Web;
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace App.Modules
{
public class HTTPHeaderModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += AddHeaderFromURL;
}
/// <summary>
/// HeaderをURLに応じて追加する
/// </summary>
private void AddHeaderFromURL(object sender, EventArgs e)
{
HttpRequest request = (HttpRequest)sender.GetType().GetProperty("Request").GetValue(sender);
HttpResponse responce = (HttpResponse)sender.GetType().GetProperty("Response").GetValue(sender);
//リクエストのURL
var url = request.Url;
//リクエストの絶対パスの先頭が/apiだったら
if (Regex.IsMatch(url.AbsolutePath, "^/api", RegexOptions.IgnoreCase))
{
if (request.Headers.AllKeys.Contains("Origin"))
{
//リクエスト元(オリジン)のURL
Uri hostUrl = new Uri(request.Headers["Origin"]);
if (IsAllowedHost(hostUrl.Host))
{
//リクエストのオリジンを許可
responce.Headers.Add("Access-Control-Allow-Origin", hostUrl.GetLeftPart(UriPartial.Authority));
}
}
}
}
public void Dispose(){}
private bool IsAllowedHost(string host)
{
return Regex.IsMatch(host, ".*twitter\\.com", RegexOptions.IgnoreCase);
}
}
}
Web.config<configuration>
<system.webServer>
<modules>
<add name="HTTPHeaderModule" type="App.Modules.HTTPHeaderModule" />
</modules>
</system.webServer>
</configuration>
하고 있는 일
Init에서 헤더 송신전에 실행되도록, AddHeaderFromURL 함수를 등록하고 있습니다.
AddHeaderFromURL 함수는 sender에 요청이나 응답이 들어있는 객체가 전달되므로 Reflection에서 검색합니다. ( HttpContext.Current 에도 요청이나 응답이 들어있어 그것을 사용해도 비슷한 동작을 합니다. 하지만 ApiController를 사용하여 응답을 반환할 때는 null이 될 수 있다 1 sender에서 가져옵니다.)
이해하기 어렵지만, Reflection에서 꺼낸 것도 참조를 복사해 오고 있을 뿐이므로, 이것 안을 변경해도 sender는 변경됩니다. 따라서 특정 조건과 일치하면 검색된 응답의 헤더에 추가됩니다.
↩
Reference
이 문제에 관하여(ASP.NET에서 특정 요청에 동적으로 HTTP 헤더를 설정하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/keymoon/items/3e4a7d5d9af8663a2bbf
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Web.config
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
View를 돌려주는 Controller로 Header를 추가하면 끝나는 이야기입니다만, 일일이 추가하는 것은 그다지 깨끗하지 않고 위에 정적으로 전달하는 파일에 대해서는 유효하지 않습니다.
이번은 Module을 이용해 요청마다 실행되는 이벤트를 작성함으로써 이용하여 실현합니다.
Module이란?
Module을 사용하면 각 요청의 중간 단계에서 처리를 인터럽트 할 수 있습니다. 이를 통해 요청에 대해 특정 동작을 수행할 수 있습니다.
소스 코드
using System;
using System.Web;
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace App.Modules
{
public class HTTPHeaderModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += AddHeaderFromURL;
}
/// <summary>
/// HeaderをURLに応じて追加する
/// </summary>
private void AddHeaderFromURL(object sender, EventArgs e)
{
HttpRequest request = (HttpRequest)sender.GetType().GetProperty("Request").GetValue(sender);
HttpResponse responce = (HttpResponse)sender.GetType().GetProperty("Response").GetValue(sender);
//リクエストのURL
var url = request.Url;
//リクエストの絶対パスの先頭が/apiだったら
if (Regex.IsMatch(url.AbsolutePath, "^/api", RegexOptions.IgnoreCase))
{
if (request.Headers.AllKeys.Contains("Origin"))
{
//リクエスト元(オリジン)のURL
Uri hostUrl = new Uri(request.Headers["Origin"]);
if (IsAllowedHost(hostUrl.Host))
{
//リクエストのオリジンを許可
responce.Headers.Add("Access-Control-Allow-Origin", hostUrl.GetLeftPart(UriPartial.Authority));
}
}
}
}
public void Dispose(){}
private bool IsAllowedHost(string host)
{
return Regex.IsMatch(host, ".*twitter\\.com", RegexOptions.IgnoreCase);
}
}
}
Web.config<configuration>
<system.webServer>
<modules>
<add name="HTTPHeaderModule" type="App.Modules.HTTPHeaderModule" />
</modules>
</system.webServer>
</configuration>
하고 있는 일
Init에서 헤더 송신전에 실행되도록, AddHeaderFromURL 함수를 등록하고 있습니다.
AddHeaderFromURL 함수는 sender에 요청이나 응답이 들어있는 객체가 전달되므로 Reflection에서 검색합니다. ( HttpContext.Current 에도 요청이나 응답이 들어있어 그것을 사용해도 비슷한 동작을 합니다. 하지만 ApiController를 사용하여 응답을 반환할 때는 null이 될 수 있다 1 sender에서 가져옵니다.)
이해하기 어렵지만, Reflection에서 꺼낸 것도 참조를 복사해 오고 있을 뿐이므로, 이것 안을 변경해도 sender는 변경됩니다. 따라서 특정 조건과 일치하면 검색된 응답의 헤더에 추가됩니다.
↩
using System;
using System.Web;
using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace App.Modules
{
public class HTTPHeaderModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += AddHeaderFromURL;
}
/// <summary>
/// HeaderをURLに応じて追加する
/// </summary>
private void AddHeaderFromURL(object sender, EventArgs e)
{
HttpRequest request = (HttpRequest)sender.GetType().GetProperty("Request").GetValue(sender);
HttpResponse responce = (HttpResponse)sender.GetType().GetProperty("Response").GetValue(sender);
//リクエストのURL
var url = request.Url;
//リクエストの絶対パスの先頭が/apiだったら
if (Regex.IsMatch(url.AbsolutePath, "^/api", RegexOptions.IgnoreCase))
{
if (request.Headers.AllKeys.Contains("Origin"))
{
//リクエスト元(オリジン)のURL
Uri hostUrl = new Uri(request.Headers["Origin"]);
if (IsAllowedHost(hostUrl.Host))
{
//リクエストのオリジンを許可
responce.Headers.Add("Access-Control-Allow-Origin", hostUrl.GetLeftPart(UriPartial.Authority));
}
}
}
}
public void Dispose(){}
private bool IsAllowedHost(string host)
{
return Regex.IsMatch(host, ".*twitter\\.com", RegexOptions.IgnoreCase);
}
}
}
Web.config
<configuration>
<system.webServer>
<modules>
<add name="HTTPHeaderModule" type="App.Modules.HTTPHeaderModule" />
</modules>
</system.webServer>
</configuration>
하고 있는 일
Init에서 헤더 송신전에 실행되도록, AddHeaderFromURL 함수를 등록하고 있습니다.
AddHeaderFromURL 함수는 sender에 요청이나 응답이 들어있는 객체가 전달되므로 Reflection에서 검색합니다. ( HttpContext.Current 에도 요청이나 응답이 들어있어 그것을 사용해도 비슷한 동작을 합니다. 하지만 ApiController를 사용하여 응답을 반환할 때는 null이 될 수 있다 1 sender에서 가져옵니다.)
이해하기 어렵지만, Reflection에서 꺼낸 것도 참조를 복사해 오고 있을 뿐이므로, 이것 안을 변경해도 sender는 변경됩니다. 따라서 특정 조건과 일치하면 검색된 응답의 헤더에 추가됩니다.
↩
Reference
이 문제에 관하여(ASP.NET에서 특정 요청에 동적으로 HTTP 헤더를 설정하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/keymoon/items/3e4a7d5d9af8663a2bbf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)