/// <summary> /// Helper message to write an error response message in case of an exception. /// </summary> /// <param name="exception"> /// The exception that caused the failure. /// </param> /// <param name="statusCode"> /// The HTTP status code that shall be returned to the caller. /// </param> /// <param name="serviceProvider"> /// The DI container. /// </param> /// <param name="requestMessage"> /// The Message for the incoming request /// </param> /// <param name="messageEncoder"> /// Message encoder of incoming request /// </param> /// <param name="httpContext"> /// The HTTP context that received the response message. /// </param> /// <returns> /// Returns the constructed message (which is implicitly written to the response /// and therefore must not be handled by the caller). /// </returns> private async Task <Message> WriteErrorResponseMessage( Exception exception, int statusCode, IServiceProvider serviceProvider, Message requestMessage, SoapMessageEncoder messageEncoder, HttpContext httpContext) { var faultExceptionTransformer = serviceProvider.GetRequiredService <IFaultExceptionTransformer>(); var faultMessage = faultExceptionTransformer.ProvideFault(exception, messageEncoder.MessageVersion, requestMessage, _xmlNamespaceManager); httpContext.Response.ContentType = httpContext.Request.ContentType; httpContext.Response.Headers["SOAPAction"] = faultMessage.Headers.Action; httpContext.Response.StatusCode = statusCode; SetHttpResponse(httpContext, faultMessage); if (messageEncoder.MessageVersion.Addressing == AddressingVersion.WSAddressing10) { // TODO: Some additional work needs to be done in order to support setting the action. Simply setting it to // "http://www.w3.org/2005/08/addressing/fault" will cause the WCF Client to not be able to figure out the type faultMessage.Headers.RelatesTo = requestMessage.Headers.MessageId; faultMessage.Headers.To = requestMessage.Headers.ReplyTo?.Uri; } await WriteMessageAsync(messageEncoder, faultMessage, httpContext); return(faultMessage); }
private async Task <string> GetWsdlFromMetaBodyWriter <T>(SoapSerializer serializer) { var service = new ServiceDescription(typeof(T)); var baseUrl = "http://tempuri.org/"; var xmlNamespaceManager = Namespaces.CreateDefaultXmlNamespaceManager(); var bodyWriter = serializer == SoapSerializer.DataContractSerializer ? new MetaWCFBodyWriter(service, baseUrl, null) as BodyWriter : new MetaBodyWriter(service, baseUrl, null, xmlNamespaceManager) as BodyWriter; var encoder = new SoapMessageEncoder(MessageVersion.Soap12WSAddressingAugust2004, System.Text.Encoding.UTF8, XmlDictionaryReaderQuotas.Max, false, true); var responseMessage = Message.CreateMessage(encoder.MessageVersion, null, bodyWriter); responseMessage = new MetaMessage(responseMessage, service, null, xmlNamespaceManager); using (var memoryStream = new MemoryStream()) { await encoder.WriteMessageAsync(responseMessage, memoryStream); memoryStream.Position = 0; using (var streamReader = new StreamReader(memoryStream)) { var result = streamReader.ReadToEnd(); return(result); } } }
private Message CreateResponseMessage( OperationDescription operation, object responseObject, Dictionary <string, object> resultOutDictionary, string soapAction, Message requestMessage, SoapMessageEncoder soapMessageEncoder) { Message responseMessage; // Create response message var bodyWriter = new ServiceBodyWriter(_serializer, operation, responseObject, resultOutDictionary); if (soapMessageEncoder.MessageVersion.Addressing == AddressingVersion.WSAddressing10) { responseMessage = Message.CreateMessage(soapMessageEncoder.MessageVersion, soapAction, bodyWriter); T_MESSAGE customMessage = new T_MESSAGE { Message = responseMessage, NamespaceManager = _xmlNamespaceManager }; responseMessage = customMessage; //responseMessage.Message = responseMessage; responseMessage.Headers.Action = operation.ReplyAction; responseMessage.Headers.RelatesTo = requestMessage.Headers.MessageId; responseMessage.Headers.To = requestMessage.Headers.ReplyTo?.Uri; } else { responseMessage = Message.CreateMessage(soapMessageEncoder.MessageVersion, null, bodyWriter); T_MESSAGE customMessage = new T_MESSAGE { Message = responseMessage, NamespaceManager = _xmlNamespaceManager }; responseMessage = customMessage; if (responseObject != null) { var messageHeaderMembers = responseObject.GetType().GetMembersWithAttribute <MessageHeaderAttribute>(); foreach (var messageHeaderMember in messageHeaderMembers) { var messageHeaderAttribute = messageHeaderMember.GetCustomAttribute <MessageHeaderAttribute>(); responseMessage.Headers.Add(MessageHeader.CreateHeader(messageHeaderAttribute.Name ?? messageHeaderMember.Name, operation.Contract.Namespace, messageHeaderMember.GetPropertyOrFieldValue(responseObject))); } } } return(responseMessage); }
public SoapEndpointMiddleware(ILogger <SoapEndpointMiddleware> logger, RequestDelegate next, SoapOptions options) { _logger = logger; _next = next; _endpointPath = options.Path; _serializer = options.SoapSerializer; _pathComparisonStrategy = options.CaseInsensitivePath ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal; _service = new ServiceDescription(options.ServiceType); _soapModelBounder = options.SoapModelBounder; _binding = options.Binding; _httpGetEnabled = options.HttpGetEnabled; _httpsGetEnabled = options.HttpsGetEnabled; _messageEncoders = new SoapMessageEncoder[options.EncoderOptions.Length]; for (var i = 0; i < options.EncoderOptions.Length; i++) { _messageEncoders[i] = new SoapMessageEncoder(options.EncoderOptions[i].MessageVersion, options.EncoderOptions[i].WriteEncoding, options.EncoderOptions[i].ReaderQuotas); } }
public SoapEndpointMiddleware(ILogger <SoapEndpointMiddleware> logger, RequestDelegate next, Type serviceType, string path, SoapEncoderOptions[] encoderOptions, SoapSerializer serializer, bool caseInsensitivePath, ISoapModelBounder soapModelBounder, Binding binding, bool httpGetEnabled, bool httpsGetEnabled) { _logger = logger; _next = next; _endpointPath = path; _serializer = serializer; _pathComparisonStrategy = caseInsensitivePath ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal; _service = new ServiceDescription(serviceType); _soapModelBounder = soapModelBounder; _binding = binding; _httpGetEnabled = httpGetEnabled; _httpsGetEnabled = httpsGetEnabled; _messageEncoders = new SoapMessageEncoder[encoderOptions.Length]; for (var i = 0; i < encoderOptions.Length; i++) { _messageEncoders[i] = new SoapMessageEncoder(encoderOptions[i].MessageVersion, encoderOptions[i].WriteEncoding, encoderOptions[i].ReaderQuotas); } }
private async Task <string> GetWsdlFromMetaBodyWriter <T>() { var service = new ServiceDescription(typeof(T)); var baseUrl = "http://tempuri.org/"; var bodyWriter = new MetaBodyWriter(service, baseUrl, null); var encoder = new SoapMessageEncoder(MessageVersion.Soap12WSAddressingAugust2004, System.Text.Encoding.UTF8, XmlDictionaryReaderQuotas.Max, false, true); var responseMessage = Message.CreateMessage(encoder.MessageVersion, null, bodyWriter); responseMessage = new MetaMessage(responseMessage, service, null); var memoryStream = new MemoryStream(); await encoder.WriteMessageAsync(responseMessage, memoryStream); memoryStream.Position = 0; var streamReader = new StreamReader(memoryStream); var result = streamReader.ReadToEnd(); return(result); }
public SoapEndpointMiddleware(ILogger <SoapEndpointMiddleware <T_MESSAGE> > logger, RequestDelegate next, SoapOptions options) { _logger = logger; _next = next; _options = options; _endpointPath = options.Path; _serializer = options.SoapSerializer; _serializerHelper = new SerializerHelper(_serializer); _pathComparisonStrategy = options.CaseInsensitivePath ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal; _service = new ServiceDescription(options.ServiceType); _soapModelBounder = options.SoapModelBounder; _binding = options.Binding; _httpGetEnabled = options.HttpGetEnabled; _httpsGetEnabled = options.HttpsGetEnabled; _xmlNamespaceManager = options.XmlNamespacePrefixOverrides ?? Namespaces.CreateDefaultXmlNamespaceManager(); Namespaces.AddDefaultNamespaces(_xmlNamespaceManager); _messageEncoders = new SoapMessageEncoder[options.EncoderOptions.Length]; for (var i = 0; i < options.EncoderOptions.Length; i++) { _messageEncoders[i] = new SoapMessageEncoder(options.EncoderOptions[i].MessageVersion, options.EncoderOptions[i].WriteEncoding, options.EncoderOptions[i].ReaderQuotas, options.OmitXmlDeclaration, options.IndentXml); } }
private static Task <Message> ReadMessageAsync(HttpContext httpContext, SoapMessageEncoder messageEncoder) { return(messageEncoder.ReadMessageAsync(httpContext.Request.BodyReader, 0x10000, httpContext.Request.ContentType)); }
private static Task WriteMessageAsync(SoapMessageEncoder messageEncoder, Message responseMessage, HttpContext httpContext) { return(messageEncoder.WriteMessageAsync(responseMessage, httpContext.Response.BodyWriter)); }
private static Task <Message> ReadMessageAsync(MemoryStream stream, SoapMessageEncoder messageEncoder) { return(messageEncoder.ReadMessageAsync(stream, 0x10000)); }