WCF IOutboundHandler Отправить не xml - PullRequest
0 голосов
/ 18 апреля 2011

Я пытаюсь написать собственный адаптер WCF с помощью SDK адаптера большого объекта WCF.Кажется, что все работает нормально, за исключением того, что мне нужно отправить текстовую строку в нижестоящую систему через сокет.Когда метод Execute для IOutboundhandler завершается, я получаю следующую ошибку:

System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1.

со следующей трассировкой стека:

  at System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.EndRequest(IAsyncResult result)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at System.ServiceModel.Channels.IRequestChannel.EndRequest(IAsyncResult result)
   at Microsoft.BizTalk.Adapter.Wcf.Runtime.WcfClient`2.RequestCallback(IAsyncResult result)".

Вот мой метод execute:

/// <summary>
    /// Executes the request message on the target system and returns a response message.
    /// If there isn’t a response, this method should return null
    /// </summary>

    public Message Execute(Message message, TimeSpan timeout)
    {
        OperationMetadata om = this.MetadataLookup.
                        GetOperationDefinitionFromOutputMessageAction(message.Headers.Action, timeout);

        if (om == null)
        {
            throw new AdapterException("Invalid operation " + message.Headers.Action);
        }

        MessageBuffer msgBuffer = message.CreateBufferedCopy(int.MaxValue);

        XmlDictionaryReader reader = msgBuffer.CreateMessage().GetReaderAtBodyContents();

        XmlDocument request = new XmlDocument();
        request.LoadXml(reader.ReadOuterXml());

        string positionalRs = this.Connection.Send(request.OuterXml);

        XmlDocument response = new XmlDocument();
        response.LoadXml(positionalRs);

        XmlReader replyReader = XmlReader.Create(new StringReader(response.InnerXml));
        return Message.CreateMessage(message.Version, message.Headers.Action + "/Response", replyReader);
    }

Как получить доступ к телу сообщения WCF, отличного от xml?

Вот как выглядит мое сообщение WCF:

Сообщение:

 <s:Envelope xmlns:a=http://www.w3.org/2005/08/addressing
xmlns:s=http://www.w3.org/2003/05/soap-envelope> 
<s:Header> 
<a:Action s:mustUnderstand=1>TCPCall</a:Action> 
<a:MessageID>urn:uuid:e473f4e4-f6f5-47b5-92a6-123116fafaa5</a:MessageID> 
<a:ReplyTo> 
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> 
 </a:ReplyTo> 
</s:Header> 
<s:Body>... stream ...</s:Body> 
</s:Envelope>

тело сообщения не является xml.всякий раз, когда я пытаюсь это сделать, я получаю следующую ошибку:

"System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1.

Я пытаюсь отправить данные в сокет на другом конце, используя wfc.Кажется, у меня все работает, кроме возможности извлекать содержимое сообщения WCF, если оно не является XML.

Это помогает?

1 Ответ

0 голосов
/ 18 апреля 2011

Похоже, вы используете неправильную привязку WCF для вашего проекта. Привязки basicHttp, wsHttp и netTcp предполагают, что вы имеете дело с документами мыла (xml). Похоже, вы захотите взглянуть на webHttpBinding и / или различные наборы инструментов WCF REST, которые предоставляют больше возможностей для создания документов запроса и ответа (XML или json, но не знают о простом тексте). Более подробная информация о том, что вы пытаетесь сделать, будет полезна для получения лучших ответов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...