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(); }
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); }
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)); }
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); }
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); }
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)); }
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); }
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); }
// 3) public static Message CreateMessage(MessageVersion version, MessageFault fault, string action) { return(new SimpleMessage(version, action, new MessageFaultBodyWriter(fault, version), true, empty_attributes)); }
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; }
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(); } }