BizTalk: обнаружена внутренняя ошибка сервера при попытке передать сообщение
У меня возникают проблемы при отправке сообщения через адаптер WCF-Custom (привязка wsHTTP). Я использую пользовательское расширение поведения конечной точки MessageInspector для удаления узлов MessageID, ReplyTo, To & Action из конверта SOAP. При отладке класса поведения конечной точки не отображается никаких ошибок, но я продолжаю получать сообщение "Произошла внутренняя ошибка сервера при попытке передать сообщение" с помощью BizTalk NACK. Код в методе BeforeSendRequest класса поведения конечной точки:
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
try
{
MessageBuffer messageBuffer = request.CreateBufferedCopy(Int32.MaxValue);
Message message = messageBuffer.CreateMessage();
messageBuffer.Close();
MemoryStream msOriginal = new MemoryStream();
XmlWriter xwOriginal = XmlWriter.Create(msOriginal);
message.WriteMessage(xwOriginal);
xwOriginal.Flush();
string originalMsg = Encoding.UTF8.GetString(msOriginal.ToArray());
xwOriginal.Close();
msOriginal.Position = 0;
msOriginal = new MemoryStream(Encoding.UTF8.GetBytes(originalMsg));
XmlDictionaryReader xdrOriginal = XmlDictionaryReader.CreateTextReader(msOriginal, new XmlDictionaryReaderQuotas());
XDocument xdoc = XDocument.Load(xdrOriginal);
var rootMsgElement = xdoc.Root;
//string rootNameSpace = "http://www.w3.org/2003/05/soap-envelope"; // string.Empty;
string nameSpace = "http://www.w3.org/2005/08/addressing";
//if (rootMsgElement.Name.LocalName == XName.Get("Envelope", rootNameSpace))
//{
if (!string.IsNullOrEmpty(xdoc.Descendants(XName.Get("Action", nameSpace)).First().Value) || !string.IsNullOrEmpty(xdoc.Descendants(XName.Get("MessageID", nameSpace)).First().Value) || !string.IsNullOrEmpty(xdoc.Descendants(XName.Get("ReplyTo", nameSpace)).First().Value) || !string.IsNullOrEmpty(xdoc.Descendants(XName.Get("To", nameSpace)).First().Value))
{
xdoc.Descendants(XName.Get("Action", nameSpace)).Remove();
xdoc.Descendants(XName.Get("MessageID", nameSpace)).Remove();
xdoc.Descendants(XName.Get("ReplyTo", nameSpace)).Remove();
xdoc.Descendants(XName.Get("To", nameSpace)).Remove();
}
//}
string updatedMsgString = rootMsgElement.ToString();
// xdoc.Save(updatedMsgString);
Message recreatedNewMessage = null;
msOriginal = new MemoryStream(Encoding.UTF8.GetBytes(updatedMsgString));
msOriginal.Position = 0;
XmlDictionaryReader newXdr = XmlDictionaryReader.CreateTextReader(msOriginal, new XmlDictionaryReaderQuotas());
recreatedNewMessage = Message.CreateMessage(newXdr, int.MaxValue, request.Version);
recreatedNewMessage.Properties.CopyProperties(request.Properties);
request = recreatedNewMessage;
}
catch (Exception ex)
{
string errorMsg = ex.Message;
if (ex.InnerException != null)
{
errorMsg += ex.InnerException.Message;
}
}
return request;
}
Как видите, я попытался установить позицию потока обратно в 0, но все равно не помогает. Я также попытался отправить сообщение без узлов MessageID, ReplyTo, To & Action непосредственно к конечной точке, и оно получило правильный ответ. Дайте мне знать, если я что-то здесь упускаю.