这是传递到我的 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