BizTalk: обнаружена внутренняя ошибка сервера при попытке передать сообщение - PullRequest
0 голосов
/ 04 октября 2018

У меня проблемы с отправкой сообщения через адаптер 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 непосредственно к конечной точке, и оно получило правильный ответ.Дайте мне знать, если я что-то здесь упускаю.

...