C\#배경 에서 크로스 필드 MVC 서비스 호출 및 쿠키 검증 실현

3701 단어 mvccookie
배경 은 부 클 라 이언 트 프레임 워 크 가 유행 하고 우수한 전단 js 프레임 워 크 가 많아 지면 서 우 리 는 도 메 인 을 뛰 어 넘 는 문제 에 부 딪 힐 수 있 습 니 다.js 의 ajax 요청 은 직접 도 메 인 을 뛰 어 넘 는 것 을 허용 하지 않 습 니 다.물론 JSONP 등 을 사용 할 수 있다 고 말 할 수 있 습 니 다.그러나 코드 결벽 증 으로 인해 전단 과 배경 에 콜 백 을 추가 하고 싶 지 않 습 니 다.그리고 많은 상황 을 통제 할 수 없습니다.너무 많은 상황 에 연루 되 어 고려 해 야 한다.
그래서 저 는 직접 돌 았 습 니 다.모든 전단 응용 은 유 니 버 설 백 엔 드 서비스 대 리 를 가 져 왔 습 니 다.이 서 비 스 는 크로스 도 메 인 문 제 를 해결 하고 자동 대리 가 프론트 데스크 에서 크로스 도 메 인 데 이 터 를 가 져 옵 니 다.
크로스 도 메 인 을 어떻게 계산 하 는 지 는 오래된 문제 이지 만 다음 두 가 지 를 주의해 야 합 니 다.같은 IP,서로 다른 포트,데이터 방문 은 크로스 도 메 인 이지 만 쿠키 방문 은 가능 합 니 다.(이것 은 이해 하기 어렵 습 니 다)
해결,소스 코드

    CookieContainer cookieContainer = new CookieContainer();

     [HttpPost]
        public string CommonPost(string url)
        {
            log.Info(CookieHelper.GetCookie("ITDC_UserName") + " CommonPost Url=" + url);
            Uri address = new Uri(System.Configuration.ConfigurationManager.AppSettings["RESTfulAPI"].ToString() + url);
            HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
       // , cookie
            cookieContainer.Add(address, GetCookie("ITDC_UserName"));
            cookieContainer.Add(address, GetCookie("ITDC_UserRole"));
            request.CookieContainer = cookieContainer;
            StringBuilder data = new StringBuilder();
            for (int i = 0; i < Request.QueryString.Count; i++)
            {
                if (Request.QueryString.Keys[i].ToString() == "url") continue;
                data.Append("&" + Request.QueryString.Keys[i].ToString() + "=" + Request.QueryString[i].ToString());
            }
            // Create a byte array of the data we want to send
            byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString().TrimStart('&'));
            // Set the content length in the request headers
            request.ContentLength = byteData.Length;
            // Write data 
            using (Stream postStream = request.GetRequestStream())
            {
                postStream.Write(byteData, 0, byteData.Length);
            } 
            string result = "";
            using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
            {
                StreamReader reader = new StreamReader(response.GetResponseStream());
                result = reader.ReadToEnd();
            }
            log.Info(CookieHelper.GetCookie("ITDC_UserName") + " CommonPost Url=" + url);
            return (result);
        }

프론트 데스크 톱 호출

Ext.Ajax.request({url: APIUrl + '/Nebula/CommonPost?url=/Nebula/PostComment/&KlId=1&Msg=ok&Author=admin&Title= ',
                  method: "POST",
                  success: function (response) {
                              Ext.Viewport.unmask();
                              var obj = Ext.decode(response.responseText);
                              Ext.Msg.alert(" ", obj.Msg, Ext.emptyFn);
                           },
                  failure: function (response) {
                              Ext.Viewport.unmask();
                              Ext.Msg.alert(" ", " , !", Ext.emptyFn);
                           }
});

좋은 웹페이지 즐겨찾기