/// <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!!!"); } }
/// <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); }