2013-07-09 4 views
0

이것은 내 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 
+0

실패를 정의 할 수 있습니까? –

+0

@LewsTherin - 예외 세부 정보 추가 – garethb

답변

0

문제는 본질적으로 utf-16 인 문자열을 인코딩 한 것으로 보입니다. 그래서 내가 사용하고 있었어도

어떻게 든, 그것이 나의 서비스에 도착했을 때, 그것은 아직도 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

을 기대하고 내 서비스와 함께 작동
관련 문제