aroud를 조사한 후 IIS Express와 Controller 클래스의 OnAuthorization 메서드 (Ref # 1)를 재정 의하여이 문제를 해결할 수있었습니다. 나는 또한 Hanselman이 추천하는 경로 (Ref # 2)로 갔다. 그러나 두 가지 이유 때문에이 두 가지 솔루션에 만족하지 못했습니다. 1. Ref # 1의 OnAuthorization은 컨트롤러 클래스 수준이 아닌 액션 수준에서만 작동합니다. 2. Ref # 2에는 많은 설정이 필요합니다 (makecert 용 Win7 SDK ), netsh 명령, 그리고 포트 80과 포트 443을 사용하려면 VS2010을 관리자 권한으로 시작해야하는데,이 점이 인상적입니다.
그래서 저는 다음과 같은 조건에서 단순성에 초점을 맞춘이 솔루션을 생각해 냈습니다.
컨트롤러 클래스 또는 작업 수준에서 RequireHttps attbbute를 사용할 수 있기를 원합니다.
RequireHttps 속성이있을 때 MVC에서 HTTPS를 사용하고 없으면 HTTP를 사용하고 싶습니다.
Visual Studio를 관리자로 실행할 필요가 없습니다.
IIS Express에서 할당 한 모든 HTTP 및 HTTPS 포트를 사용하고 싶습니다 (참고 # 1 참조).
IIS Express의 자체 서명 된 SSL 인증서를 재사용 할 수 있으며 잘못된 SSL 프롬프트가 표시 되어도 상관 없습니다.
개발, 테스트 및 프로덕션이 동일한 코드베이스와 동일한 바이너리를 사용하고 가능한 한 추가 설정 (예 : netsh, mmc cert 스냅인 등 사용)과 독립적으로 사용하기를 원합니다.
이제 배경과 설명을 제외하고이 코드가 누군가를 돕고 시간을 절약하기를 바랍니다. 기본적으로 Controller에서 상속하는 BaseController 클래스를 만들고이 기본 클래스에서 컨트롤러 클래스를 파생시킵니다. 지금까지 읽었으므로이 작업을 수행하는 방법을 알고 있다고 가정합니다. 자, 행복한 코딩!
Note # 1 : 이것은 유용한 함수 'getConfig'(코드 참조)를 사용하여 이루어집니다.
참조 # 1 : http://puredotnetcoder.blogspot.com/2011/09/requirehttps-attribute-in-mvc3.html
참조 # 2 : http://www.hanselman.com/blog/WorkingWithSSLAtDevelopmentTimeIsEasierWithIISExpress.aspx
========== BaseController의 코드 ==================
#region Override to reroute to non-SSL port if controller action does not have RequireHttps attribute to save on CPU
// By L. Keng, 2012/08/27
// Note that this code works with RequireHttps at the controller class or action level.
// Credit: Various stackoverflow.com posts and http://puredotnetcoder.blogspot.com/2011/09/requirehttps-attribute-in-mvc3.html
protected override void OnAuthorization(AuthorizationContext filterContext)
{
// if the controller class or the action has RequireHttps attribute
var requireHttps = (filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(RequireHttpsAttribute), true).Count() > 0
|| filterContext.ActionDescriptor.GetCustomAttributes(typeof(RequireHttpsAttribute), true).Count() > 0);
if (Request.IsSecureConnection)
{
// If request has a secure connection but we don't need SSL, and we are not on a child action
if (!requireHttps && !filterContext.IsChildAction)
{
var uriBuilder = new UriBuilder(Request.Url)
{
Scheme = "http",
Port = int.Parse(getConfig("HttpPort", "80")) // grab from config; default to port 80
};
filterContext.Result = this.Redirect(uriBuilder.Uri.AbsoluteUri);
}
}
else
{
// If request does not have a secure connection but we need SSL, and we are not on a child action
if (requireHttps && !filterContext.IsChildAction)
{
var uriBuilder = new UriBuilder(Request.Url)
{
Scheme = "https",
Port = int.Parse(getConfig("HttpsPort", "443")) // grab from config; default to port 443
};
filterContext.Result = this.Redirect(uriBuilder.Uri.AbsoluteUri);
}
}
base.OnAuthorization(filterContext);
}
#endregion
// a useful helper function to get appSettings value; allow caller to specify a default value if one cannot be found
internal static string getConfig(string name, string defaultValue = null)
{
var val = System.Configuration.ConfigurationManager.AppSettings[name];
return (val == null ? defaultValue : val);
}
============== 종료 코드 ===============
Web.Release.Config에서 다음을 추가하여 HttpPort 및 HttpsPort를 지우십시오 (기본값 80 및 443 사용).
<appSettings>
<add key="HttpPort" value="" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
<add key="HttpsPort" value="" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>