0

这是传递到我的 wcf 服务时失败的行(我已经删除并交换了字母,因为这是一个实际的客户地址,但有问题的字符留在原地)。

<StreetAddress>TU Dasdfasdn, asdfa für adsf, htras-Bähr-trf. 1</StreetAddress>

注意 ü 和 ä 字符。如果我从地址中删除这些字符并将 XML 发送到服务,它会正常运行。

我找到了一种可行的解决方案,它涉及重新创建传入消息,如下所示:

之前的代码

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
   buffer = request.CreateBufferedCopy(Int32.MaxValue); // FAILS HERE!!!
   var requestCopy = buffer.CreateMessage();       
   ... do stuff ....
   return null;
}

带修复的代码

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
    var dictionaryReader = request.GetReaderAtBodyContents();
    var outerXml = dictionaryReader.ReadOuterXml();
    var parsedOuterXml = XElement.Parse(outerXml);
    var replacedRequest = Message.CreateMessage(request.Version, request.Headers.Action, parsedOuterXml);
    replacedRequest.Headers.CopyHeadersFrom(request.Headers);
    replacedRequest.Properties.CopyProperties(request.Properties);
    request = replacedRequest;


   buffer = request.CreateBufferedCopy(Int32.MaxValue); // NO LONGER FAILS HERE
   var requestCopy = buffer.CreateMessage();
    ..... do stuff .......
    return null
}

没有意义的是修复后 XML 中的地址完全相同,包括 ü 和 ä 字符。但是这次我的代码运行良好并且没有错误。

我唯一能想到的是对 XElement.Parse 的调用以某种方式解决了任何编码问题,而 CreateBufferedCopy 不会,但这只是一个猜测。

有没有“正确”的方法来解决这个问题?有没有人遇到过这个?我发现的“修复”实际上并没有做任何事情,因为之前和之后的 XML 是相同的(不知道它为什么起作用),我宁愿一个更优雅的解决方案,或者至少解释正在发生的事情。

编辑:抛出的异常是“文件意外结束。以下元素未关闭:信封。第 105 行,位置 3。”

at System.Xml.XmlExceptionHelper.ThrowXmlException(XmlDictionaryReader reader, String res, String arg1, String arg2, String arg3)
   at System.Xml.XmlBufferReader.EnsureBytes(Int32 count)
   at System.Xml.XmlBufferReader.GetBuffer(Int32 count, Int32& offset)
   at System.Xml.XmlUTF8TextReader.ReadEndElement()
   at System.Xml.XmlUTF8TextReader.Read()
   at System.Xml.XmlBaseReader.MoveToContent()
   at System.Xml.XmlBaseReader.ReadEndElement()
   at System.ServiceModel.Channels.Message.ReadFromBodyContentsToEnd(XmlDictionaryReader reader, EnvelopeVersion envelopeVersion)
   at System.ServiceModel.Channels.ReceivedMessage.OnWriteBodyContents(XmlDictionaryWriter writer)
   at System.ServiceModel.Channels.Message.OnWriteMessage(XmlDictionaryWriter writer)
   at System.ServiceModel.Channels.Message.OnCreateBufferedCopy(Int32 maxBufferSize, XmlDictionaryReaderQuotas quotas)
   at System.ServiceModel.Channels.Message.CreateBufferedCopy(Int32 maxBufferSize)
   at Stella.ServiceLibrary.Security.MessageLogInspector.AfterReceiveRequest(Message& request, IClientChannel channel, InstanceContext instanceContext) in C:\Projects\SIHOT_CRES\WebServiceProjects\Stella.ServiceLibrary\Security\MessageLogInspector.cs:line 94
4

1 回答 1

0

问题似乎是我正在编码一个本质上是 utf-16 的字符串。所以即使我在使用

byte[] content = Encoding.UTF8.GetBytes(myXDocument.ToString());

不知何故,当它为我服务时,它仍然是 utf-16。相反,我不得不使用带有内存流的 XmlWriter 并返回如下

XmlWriterSettings writerSettings = new XmlWriterSettings {Encoding = Encoding.UTF8};
MemoryStream buffer = new MemoryStream();
using (XmlWriter writer = XmlWriter.Create(buffer, writerSettings))
{
    myXDocument.WriteTo(writer);
    writer.Flush();
    writer.Close();
    result = buffer.ToArray();
}
return result;

结果现在是编码为 utf-8 的字节 [],现在可以与我的服务一起使用,该服务需要 utf-8

于 2013-07-18T04:44:36.597 回答