示例#1
0
        public void ProvideFault(Exception error, System.ServiceModel.Channels.MessageVersion version, ref System.ServiceModel.Channels.Message fault)
        {
            if (error is FaultException)
            {
                return;
            }
            FaultException fe = new FaultException("A General service error has occured");

            System.ServiceModel.Channels.MessageFault mf = fe.CreateMessageFault();
            fault = Message.CreateMessage(version, mf, null);
            //throw new NotImplementedException();
        }
示例#2
0
        protected override bool OnTryCreateException(
            Message message, MessageFault fault, out Exception error)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }
            if (fault == null)
            {
                throw new ArgumentNullException("fault");
            }

            error = null;

            FaultCode fc;

            if (version.Envelope.Equals(EnvelopeVersion.Soap11))
            {
                fc = fault.Code;
            }
            else
            {
                fc = fault.Code.SubCode;
            }

            if (fc == null)
            {
                return(false);
            }

            string msg = fault.Reason.GetMatchingTranslation().Text;

            if (fc.Namespace == message.Version.Addressing.Namespace)
            {
                switch (fc.Name)
                {
                case "ActionNotSupported":
                    error = new ActionNotSupportedException(msg);
                    return(true);

                case "DestinationUnreachable":
                    error = new EndpointNotFoundException(msg);
                    return(true);
                }
            }

            return(false);
        }
示例#3
0
 public static Message CreateMessage(MessageVersion version, FaultCode faultCode, string reason, object detail, string action)
 {
     if (version == null)
     {
         throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("version"));
     }
     if (faultCode == null)
     {
         throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("faultCode"));
     }
     if (reason == null)
     {
         throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("reason"));
     }
     return(CreateMessage(version, MessageFault.CreateFault(faultCode, new FaultReason(reason), detail), action));
 }
示例#4
0
        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            FaultException e;

            if (m_BizExceptionType != null && m_BizExceptionType.IsAssignableFrom(error.GetType()))
            {
                e = new FaultException(error.Message, new FaultCode(error.GetType().FullName));
            }
            else
            {
                e = new FaultException("系统异常,请联系管理员!", new FaultCode(error.GetType().FullName));
            }

            System.ServiceModel.Channels.MessageFault m = e.CreateMessageFault();
            fault = Message.CreateMessage(version, m, e.Action);
        }
示例#5
0
        protected override bool OnTryCreateException(Message message, MessageFault fault, out Exception exception)
        {
            if (this.innerChannel == null)
            {
                exception = null;
                return(false);
            }
            FaultConverter property = this.innerChannel.GetProperty <FaultConverter>();

            if (property != null)
            {
                return(property.TryCreateException(message, fault, out exception));
            }
            exception = null;
            return(false);
        }
示例#6
0
            void ValidateResponse(Message response)
            {
                if (response != null)
                {
                    if (response.Version == MessageVersion.None && response is NullMessage)
                    {
                        response.Close();
                        return;
                    }

                    Exception innerException = null;

                    if (response.IsFault)
                    {
                        try
                        {
                            MessageFault messageFault = MessageFault.CreateFault(response, TransportDefaults.MaxFaultSize);
                            innerException = new FaultException(messageFault);
                        }
                        catch (Exception e)
                        {
                            if (Fx.IsFatal(e))
                            {
                                throw;
                            }

                            if (e is CommunicationException ||
                                e is TimeoutException ||
                                e is XmlException ||
                                e is IOException)
                            {
                                innerException = e; // expected exception generating fault
                            }
                            else
                            {
                                throw;
                            }
                        }
                    }

                    throw TraceUtility.ThrowHelperError(
                              new ProtocolException(SR.GetString(SR.OneWayUnexpectedResponse), innerException),
                              response);
                }
            }
        internal static Message CreateEndpointNotFoundFault(MessageVersion version, string reason)
        {
            FaultCode code2;
            FaultCode subCode = new FaultCode("EndpointUnavailable", version.Addressing.Namespace);

            if (version.Envelope == EnvelopeVersion.Soap11)
            {
                code2 = subCode;
            }
            else
            {
                if (version.Envelope != EnvelopeVersion.Soap12)
                {
                    throw Fx.AssertAndThrow("Unsupported version.");
                }
                code2 = FaultCode.CreateSenderFaultCode(subCode);
            }
            FaultReason  reason2 = new FaultReason(reason, CultureInfo.CurrentCulture);
            MessageFault fault   = MessageFault.CreateFault(code2, reason2);

            return(Message.CreateMessage(version, fault, version.Addressing.DefaultFaultAction));
        }
            protected override bool OnTryCreateException(Message message, MessageFault fault, out Exception exception)
            {
                exception = null;

                // SOAP MustUnderstand
                if (string.Compare(fault.Code.Namespace, _version.Envelope.Namespace, StringComparison.Ordinal) == 0 &&
                    string.Compare(fault.Code.Name, MessageStrings.MustUnderstandFault, StringComparison.Ordinal) == 0)
                {
                    exception = new ProtocolException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text);
                    return(true);
                }

                bool      checkSender;
                bool      checkReceiver;
                FaultCode code;

                if (_version.Envelope == EnvelopeVersion.Soap11)
                {
                    checkSender   = true;
                    checkReceiver = true;
                    code          = fault.Code;
                }
                else
                {
                    checkSender   = fault.Code.IsSenderFault;
                    checkReceiver = fault.Code.IsReceiverFault;
                    code          = fault.Code.SubCode;
                }

                if (code == null)
                {
                    return(false);
                }

                if (code.Namespace == null)
                {
                    return(false);
                }

                if (checkSender)
                {
                    // WS-Addressing
                    if (string.Compare(code.Namespace, _version.Addressing.Namespace, StringComparison.Ordinal) == 0)
                    {
                        if (string.Compare(code.Name, AddressingStrings.ActionNotSupported, StringComparison.Ordinal) == 0)
                        {
                            exception = new ActionNotSupportedException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text);
                            return(true);
                        }
                        else if (string.Compare(code.Name, AddressingStrings.DestinationUnreachable, StringComparison.Ordinal) == 0)
                        {
                            exception = new EndpointNotFoundException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text);
                            return(true);
                        }
                        else if (string.Compare(code.Name, Addressing10Strings.InvalidAddressingHeader, StringComparison.Ordinal) == 0)
                        {
                            if (code.SubCode != null && string.Compare(code.SubCode.Namespace, _version.Addressing.Namespace, StringComparison.Ordinal) == 0 &&
                                string.Compare(code.SubCode.Name, Addressing10Strings.InvalidCardinality, StringComparison.Ordinal) == 0)
                            {
                                exception = new MessageHeaderException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text, true);
                                return(true);
                            }
                        }
                        else if (_version.Addressing == AddressingVersion.WSAddressing10)
                        {
                            if (string.Compare(code.Name, Addressing10Strings.MessageAddressingHeaderRequired, StringComparison.Ordinal) == 0)
                            {
                                exception = new MessageHeaderException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text);
                                return(true);
                            }
                            else if (string.Compare(code.Name, Addressing10Strings.InvalidAddressingHeader, StringComparison.Ordinal) == 0)
                            {
                                exception = new ProtocolException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text);
                                return(true);
                            }
                        }
                        else
                        {
                            if (string.Compare(code.Name, Addressing200408Strings.MessageInformationHeaderRequired, StringComparison.Ordinal) == 0)
                            {
                                exception = new ProtocolException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text);
                                return(true);
                            }
                            else if (string.Compare(code.Name, Addressing200408Strings.InvalidMessageInformationHeader, StringComparison.Ordinal) == 0)
                            {
                                exception = new ProtocolException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text);
                                return(true);
                            }
                        }
                    }
                }

                if (checkReceiver)
                {
                    // WS-Addressing
                    if (string.Compare(code.Namespace, _version.Addressing.Namespace, StringComparison.Ordinal) == 0)
                    {
                        if (string.Compare(code.Name, AddressingStrings.EndpointUnavailable, StringComparison.Ordinal) == 0)
                        {
                            exception = new ServerTooBusyException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text);
                            return(true);
                        }
                    }
                }

                return(false);
            }
 protected abstract bool OnTryCreateException(Message message, MessageFault fault, out Exception exception);
        public bool TryCreateException(Message message, MessageFault fault, out Exception exception)
        {
            exception = default(Exception);

            return(default(bool));
        }
示例#11
0
 public bool TryCreateException(Message message, MessageFault fault, out Exception error)
 {
     return(OnTryCreateException(message, fault, out error));
 }
        public static bool TryCreateFault12(ReliableMessagingVersion reliableMessagingVersion, Message message, MessageFault fault, out WsrmHeaderFault wsrmFault)
        {
            if (!fault.Code.IsSenderFault && !fault.Code.IsReceiverFault)
            {
                wsrmFault = null;
                return(false);
            }
            if (((fault.Code.SubCode == null) || (fault.Code.SubCode.Namespace != WsrmIndex.GetNamespaceString(reliableMessagingVersion))) || !fault.HasDetail)
            {
                wsrmFault = null;
                return(false);
            }
            string name = fault.Code.SubCode.Name;
            XmlDictionaryReader readerAtDetailContents = fault.GetReaderAtDetailContents();

            wsrmFault = CreateWsrmHeaderFault(reliableMessagingVersion, fault.Code, name, fault.Reason, readerAtDetailContents);
            return(wsrmFault != null);
        }
        public static bool TryCreateFault11(ReliableMessagingVersion reliableMessagingVersion, Message message, MessageFault fault, int index, out WsrmHeaderFault wsrmFault)
        {
            string str2;
            string str3;

            if (index == -1)
            {
                wsrmFault = null;
                return(false);
            }
            if (!fault.Code.IsSenderFault && !fault.Code.IsReceiverFault)
            {
                wsrmFault = null;
                return(false);
            }
            string subcode = WsrmSequenceFaultHeader.GetSubcode(message.Headers.GetReaderAtHeader(index), reliableMessagingVersion);

            if (subcode == null)
            {
                wsrmFault = null;
                return(false);
            }
            LookupDetailInformation(reliableMessagingVersion, subcode, out str2, out str3);
            XmlDictionaryReader detailReader = WsrmSequenceFaultHeader.GetReaderAtDetailContents(str2, str3, message.Headers.GetReaderAtHeader(index), reliableMessagingVersion);

            if (detailReader == null)
            {
                wsrmFault = null;
                return(false);
            }
            wsrmFault = CreateWsrmHeaderFault(reliableMessagingVersion, fault.Code, subcode, fault.Reason, detailReader);
            if (wsrmFault != null)
            {
                message.Headers.UnderstoodHeaders.Add(message.Headers[index]);
                return(true);
            }
            return(false);
        }
示例#14
0
            protected override bool OnTryCreateException(Message message, MessageFault fault, out Exception exception)
            {
                bool      isSenderFault;
                bool      isReceiverFault;
                FaultCode subCode;

                exception = null;
                if ((string.Compare(fault.Code.Namespace, this.version.Envelope.Namespace, StringComparison.Ordinal) == 0) && (string.Compare(fault.Code.Name, "MustUnderstand", StringComparison.Ordinal) == 0))
                {
                    exception = new ProtocolException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text);
                    return(true);
                }
                if (this.version.Envelope == EnvelopeVersion.Soap11)
                {
                    isSenderFault   = true;
                    isReceiverFault = true;
                    subCode         = fault.Code;
                }
                else
                {
                    isSenderFault   = fault.Code.IsSenderFault;
                    isReceiverFault = fault.Code.IsReceiverFault;
                    subCode         = fault.Code.SubCode;
                }
                if (subCode != null)
                {
                    if (subCode.Namespace == null)
                    {
                        return(false);
                    }
                    if (isSenderFault && (string.Compare(subCode.Namespace, this.version.Addressing.Namespace, StringComparison.Ordinal) == 0))
                    {
                        if (string.Compare(subCode.Name, "ActionNotSupported", StringComparison.Ordinal) == 0)
                        {
                            exception = new ActionNotSupportedException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text);
                            return(true);
                        }
                        if (string.Compare(subCode.Name, "DestinationUnreachable", StringComparison.Ordinal) == 0)
                        {
                            exception = new EndpointNotFoundException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text);
                            return(true);
                        }
                        if (string.Compare(subCode.Name, "InvalidAddressingHeader", StringComparison.Ordinal) == 0)
                        {
                            if (((subCode.SubCode != null) && (string.Compare(subCode.SubCode.Namespace, this.version.Addressing.Namespace, StringComparison.Ordinal) == 0)) && (string.Compare(subCode.SubCode.Name, "InvalidCardinality", StringComparison.Ordinal) == 0))
                            {
                                exception = new MessageHeaderException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text, true);
                                return(true);
                            }
                        }
                        else if (this.version.Addressing == AddressingVersion.WSAddressing10)
                        {
                            if (string.Compare(subCode.Name, "MessageAddressingHeaderRequired", StringComparison.Ordinal) == 0)
                            {
                                exception = new MessageHeaderException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text);
                                return(true);
                            }
                            if (string.Compare(subCode.Name, "InvalidAddressingHeader", StringComparison.Ordinal) == 0)
                            {
                                exception = new ProtocolException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text);
                                return(true);
                            }
                        }
                        else
                        {
                            if (string.Compare(subCode.Name, "MessageInformationHeaderRequired", StringComparison.Ordinal) == 0)
                            {
                                exception = new ProtocolException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text);
                                return(true);
                            }
                            if (string.Compare(subCode.Name, "InvalidMessageInformationHeader", StringComparison.Ordinal) == 0)
                            {
                                exception = new ProtocolException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text);
                                return(true);
                            }
                        }
                    }
                    if ((isReceiverFault && (string.Compare(subCode.Namespace, this.version.Addressing.Namespace, StringComparison.Ordinal) == 0)) && (string.Compare(subCode.Name, "EndpointUnavailable", StringComparison.Ordinal) == 0))
                    {
                        exception = new ServerTooBusyException(fault.Reason.GetMatchingTranslation(CultureInfo.CurrentCulture).Text);
                        return(true);
                    }
                }
                return(false);
            }
示例#15
0
 // 3)
 public static Message CreateMessage(MessageVersion version,
                                     MessageFault fault, string action)
 {
     return(new SimpleMessage(version, action,
                              new MessageFaultBodyWriter(fault, version), true, empty_attributes));
 }
示例#16
0
 protected override bool OnTryCreateException(
     Message message, MessageFault fault, out Exception error)
 {
     error = null;
     return(false);
 }
 public FaultBodyWriter(MessageFault fault, EnvelopeVersion version) : base(true)
 {
     this.fault   = fault;
     this.version = version;
 }
示例#18
0
        protected override void ProcessReply(Message msg, TimeSpan timeout)
        {
            if (msg == null)
            {
                throw new ArgumentNullException("msg");
            }

            // Handle DestinationUnreacheable as 400 (it is what .NET does).
            if (msg.IsFault)
            {
                // FIXME: isn't there any better way?
                var mb    = msg.CreateBufferedCopy(0x10000);
                var fault = MessageFault.CreateFault(mb.CreateMessage(), 0x10000);
                if (fault.Code.Name == "DestinationUnreachable")
                {
                    ctx.Response.StatusCode = 400;
                    return;
                }
                else
                {
                    msg = mb.CreateMessage();
                }
            }

            // FIXME: should this be done here?
            if (channel.MessageVersion.Addressing.Equals(AddressingVersion.None))
            {
                msg.Headers.Action = null;                 // prohibited
            }
            MemoryStream ms = new MemoryStream();

            channel.Encoder.WriteMessage(msg, ms);
            ctx.Response.ContentType = channel.Encoder.ContentType;

            string pname = HttpResponseMessageProperty.Name;
            bool   suppressEntityBody = false;

            if (msg.Properties.ContainsKey(pname))
            {
                HttpResponseMessageProperty hp = (HttpResponseMessageProperty)msg.Properties [pname];
                string contentType             = hp.Headers ["Content-Type"];
                if (contentType != null)
                {
                    ctx.Response.ContentType = contentType;
                }
                ctx.Response.Headers.Add(hp.Headers);
                if (hp.StatusCode != default(HttpStatusCode))
                {
                    ctx.Response.StatusCode = (int)hp.StatusCode;
                }
                ctx.Response.StatusDescription = hp.StatusDescription;
                if (hp.SuppressEntityBody)
                {
                    suppressEntityBody = true;
                }
            }
            if (!suppressEntityBody)
            {
                ctx.Response.ContentLength64 = ms.Length;
                ctx.Response.OutputStream.Write(ms.GetBuffer(), 0, (int)ms.Length);
                ctx.Response.OutputStream.Flush();
            }
        }