잊지 않겠습니다.

MVC4에서 API Controller가 나왔지만, 기존 MVC3에서도 API Controller와 거의 유사하게 동작이 가능한 API Controller를 작성 가능하다.


API Controller와 동일하게 동작하기 위해서는 Json형태로만 return을 시켜주면 되기 때문에, 굳이 기존의 APIController를 사용할 필요성은 없어보이기도 한다. 다만 XmlRpc와 같은 다른 Protocol을 충족시키기위해서는 필요한 사항이 있더라도 말이다. 


또한, API서버를 구축하고, 구축된 서버를 이용한 Cross Domain 문제를 해결하기 위해서는 Response의 Header에 AcessControlAllowOrgin 항목을 을 추가시켜줘야지 된다. 이는 이 API 서버에서 사용이 허용된 사이트가 어디인지를 확인하는 것으로 반드시 들어가줘야지 된다. 이 항목을 넣어주는 방법으로는 다음 3가지 방법이 존재한다. 



1. IIS에 기본 설정을 넣어주는 방법

> Response Header 설정을 이용. 모든 response에 Access-Control-Allow-Orgin을 허용으로 넣어준다. 



2. Global의 Application_BeginRequest을 이용하는 방법

> Global.asax.cs파일에 Applicaiton_BeginRequest를 구현한다.


        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            HttpContext.Current.Response.Cache.SetNoStore();
            SetEnabledCrossDmainAjaxCall();
        }

        private void SetEnabledCrossDmainAjaxCall()
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
            if(HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
                HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
                HttpContext.Current.Response.End();
            }
        }


3. Action Filter의 OnResultExcuted를 구현, ActionFilter를 적용하는 방법

> ActionFilter를 구현한다.


    public class CrossDomainAjaxCallAttribute : ActionFilterAttribute
    {
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
            base.OnResultExecuted(filterContext);
        }
    }


Posted by Y2K
,