protected Task HandleException(IRequest httpReq, IResponse httpRes, string operationName, Exception ex) { var errorMessage = string.Format("Error occured while Processing Request: {0}", ex.Message); Log.Error(errorMessage, ex); try { HostContext.RaiseUncaughtException(httpReq, httpRes, operationName, ex); return(EmptyTask); } catch (Exception writeErrorEx) { //Exception in writing to response should not hide the original exception Log.Info("Failed to write error to response: {0}", writeErrorEx); //rethrow the original exception return(ex.AsTaskException()); } finally { httpRes.EndRequest(skipHeaders: true); } }
protected Message ExecuteMessage(Message message, RequestAttributes requestAttributes, IRequest httpReq, IResponse httpRes) { var soapFeature = requestAttributes.ToSoapFeature(); appHost.AssertFeatures(soapFeature); if (httpReq == null) { httpReq = HostContext.GetCurrentRequest(); } if (httpRes == null && httpReq != null) { httpRes = httpReq.Response; } if (httpReq == null) { throw new ArgumentNullException(nameof(httpReq)); } if (httpRes == null) { throw new ArgumentNullException(nameof(httpRes)); } httpReq.UseBufferedStream = true; var requestMsg = message ?? GetRequestMessageFromStream(httpReq.InputStream); var soapAction = httpReq.GetHeader(HttpHeaders.SOAPAction) ?? GetAction(requestMsg); if (soapAction != null) { httpReq.OperationName = soapAction.Trim('"'); } if (HostContext.ApplyCustomHandlerRequestFilters(httpReq, httpRes)) { return(PrepareEmptyResponse(message, httpReq)); } string requestXml = GetRequestXml(requestMsg); var requestType = GetRequestType(requestMsg, requestXml); httpReq.OperationName = requestType.GetOperationName(); if (!HostContext.Metadata.CanAccess(requestAttributes, soapFeature.ToFormat(), requestType.GetOperationName())) { throw HostContext.UnauthorizedAccess(requestAttributes); } try { var useXmlSerializerRequest = requestType.HasAttribute <XmlSerializerFormatAttribute>(); var request = appHost.ApplyRequestConvertersAsync(httpReq, useXmlSerializerRequest ? XmlSerializableSerializer.Instance.DeserializeFromString(requestXml, requestType) : Serialization.DataContractSerializer.Instance.DeserializeFromString(requestXml, requestType) ).Result; httpReq.Dto = request; if (request is IRequiresSoapMessage requiresSoapMessage) { requiresSoapMessage.Message = requestMsg; } httpReq.SetItem(Keywords.SoapMessage, requestMsg); httpRes.ContentType = GetSoapContentType(httpReq.ContentType); var hasRequestFilters = HostContext.AppHost.GlobalRequestFiltersArray.Length > 0 || HostContext.AppHost.GlobalRequestFiltersAsyncArray.Length > 0 || FilterAttributeCache.GetRequestFilterAttributes(request.GetType()).Any(); if (hasRequestFilters) { HostContext.ApplyRequestFiltersAsync(httpReq, httpRes, request).Wait(); if (httpRes.IsClosed) { return(EmptyResponse(requestMsg, requestType)); } } httpReq.RequestAttributes |= requestAttributes; var response = ExecuteService(request, httpReq); if (response is Task taskResponse) { response = taskResponse.GetResult(); } response = appHost.ApplyResponseConvertersAsync(httpReq, response).Result; appHost.ApplyResponseFiltersAsync(httpReq, httpRes, response).Wait(); if (httpRes.IsClosed) { return(EmptyResponse(requestMsg, requestType)); } var httpResult = response as IHttpResult; if (httpResult != null) { response = httpResult.Response; } var noMsgAction = requestMsg.Headers.Action == null; var responseMsg = CreateResponseMessage(response, requestMsg.Version, requestType, noMsgAction); if (httpResult != null) { SetErrorStatusIfAny(httpReq.Response, responseMsg, httpResult.Status); } return(responseMsg); } catch (Exception ex) { if (httpReq.Dto != null) { HostContext.RaiseServiceException(httpReq, httpReq.Dto, ex).Wait(); } else { HostContext.RaiseUncaughtException(httpReq, httpRes, httpReq.OperationName, ex).Wait(); } throw new SerializationException("3) Error trying to deserialize requestType: " + requestType + ", xml body: " + requestXml, ex); } }