/// <summary>
        /// aspx, ashx의 <see cref="HttpContext"/>로부터 XdsRequestDocument를 만들고,
        /// 처리를 수행 한 후, XdsResponseDocument를 HttpContext의 Response.OutputStream에 Write를 수행합니다.
        /// </summary>
        /// <param name="context"></param>
        public static void Execute(HttpContext context)
        {
            context.ShouldNotBeNull("context");

            if (IsDebugEnabled)
            {
                log.Debug(@"Execution for request from HttpContext is starting...");
            }

            var request     = context.Request;
            var productName = request.GetProductName();
            var compress    = request.GetUseCompress();
            var security    = request.GetUseSecurity();

            var serializer = XmlDataServiceTool.GetSerializer(compress, security);

            XdsResponseDocument result = null;

            try {
                CheckProductExists(productName);
                Guard.Assert(request.TotalBytes > 0, "처리할 요청정보가 제공되지 않았습니다.");

                var requestBytes = request.InputStream.ToBytes();
                var xdsRequest   = ((byte[])serializer.Deserialize(requestBytes)).ConvertToXdsRequestDocument();

                // var xdsRequest = XmlTool.Deserialize<XdsRequestDocument>(request.InputStream);
                result = Execute(xdsRequest, productName);
            }
            catch (Exception ex) {
                if (log.IsErrorEnabled)
                {
                    log.ErrorException("요청처리 중 예외가 발생했습니다.", ex);
                }

                // 예외정보를 Client에게도 보낸다.
                result = result ?? new XdsResponseDocument();
                result.ReportError(ex);
            }
            finally {
                if (result != null)
                {
                    WriteResponse(context.Response, result, serializer);
                }
            }

            if (IsDebugEnabled)
            {
                log.Debug("Execution for request from HttpContext is finished!!!");
            }
        }
Esempio n. 2
0
        /// <summary>
        /// 요청정보를 실행하여 응답정보를 반환합니다.
        /// </summary>
        /// <param name="requestDocument">요청정보</param>
        /// <param name="commandTimeout">요청 처리 제한 시간 (단위 : seconds, 기본값 : 90)</param>
        /// <returns>요청 처리 응답정보</returns>
        public virtual XdsResponseDocument Execute(XdsRequestDocument requestDocument, int?commandTimeout)
        {
            if (IsDebugEnabled)
            {
                log.Debug("요청정보에 따른 Database 작업을 시작합니다...");
            }

            requestDocument.ShouldNotBeNull("requestDocument");

            if (requestDocument == null)
            {
                return(XmlDataTool.CreateResponseWithError(new InvalidOperationException(MsgConsts.NoRequestProvided)));
            }

            var responseDocument     = new XdsResponseDocument();
            TransactionScope txScope = null;

            try {
                if (IsDebugEnabled)
                {
                    log.Debug("요청문서 분석 및 응답문서를 초기화 합니다.");
                }

                requestDocument.CopyRequestHeader(responseDocument);

                if (requestDocument.CommandTimeout > commandTimeout.GetValueOrDefault(90))
                {
                    commandTimeout = requestDocument.CommandTimeout;
                }

                if (requestDocument.Transaction)
                {
                    if (IsDebugEnabled)
                    {
                        log.Debug("요청문서에 Transaction 적용 옵션이 설정되어 있습니다. TransactionScope를 이용하여, 전체 요청을 Transaction 하에서 실행합니다.");
                    }

                    txScope = AdoTool.CreateTransactionScope(TransactionScopeOption.Required, IsolationLevel.ReadCommitted);
                }

                //! 실제 요청 처리
                ExecuteRequestCore(requestDocument, responseDocument);


                // Transaction을 Commit 한다
                //
                if (txScope != null)
                {
                    if (IsDebugEnabled)
                    {
                        log.Debug("Transaction Commit을 시작합니다...");
                    }

                    txScope.Complete();

                    if (IsDebugEnabled)
                    {
                        log.Debug("Transaction Commit에 성공했습니다.!!!");
                    }
                }
            }
            catch (Exception ex) {
                responseDocument.ReportError(ex);
            }
            finally {
                if (txScope != null)
                {
                    txScope.Dispose();
                }
            }

            if (IsDebugEnabled)
            {
                log.Debug("모든 요청을 처리하고, ResponseDocument를 반환합니다.");
            }

            return(responseDocument);
        }