Пример #1
0
        /// <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);
        }
Пример #2
0
        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);
                }
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
            }
        }
Пример #5
0
        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);
            }
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
            }
        }
Пример #8
0
 private static Task <Message> ReadMessageAsync(HttpContext httpContext, SoapMessageEncoder messageEncoder)
 {
     return(messageEncoder.ReadMessageAsync(httpContext.Request.BodyReader, 0x10000, httpContext.Request.ContentType));
 }
Пример #9
0
 private static Task WriteMessageAsync(SoapMessageEncoder messageEncoder, Message responseMessage, HttpContext httpContext)
 {
     return(messageEncoder.WriteMessageAsync(responseMessage, httpContext.Response.BodyWriter));
 }
Пример #10
0
 private static Task <Message> ReadMessageAsync(MemoryStream stream, SoapMessageEncoder messageEncoder)
 {
     return(messageEncoder.ReadMessageAsync(stream, 0x10000));
 }