이것은 내 wcf 서비스로 전달 될 때 실패한 행입니다 (실제 고객 주소 였기 때문에 문자를 제거하고 바꿨지 만 문제의 문자는 그대로 두었습니다).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이 동일하고 (작동하는 이유를 모르는) XML로 발견 된 '수정'은 실제로는 아무 것도하지 않으며 오히려보다 우아한 해결책 또는 적어도 일어나는 일에 대한 설명을 제공합니다.
EDIT : "예상치 못한 파일 끝, 다음 요소가 닫히지 않음 : 봉투 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
실패를 정의 할 수 있습니까? –
@LewsTherin - 예외 세부 정보 추가 – garethb