IDispatchOperationSelector를 사용하여 서비스를 누르기 전에 Wcf 메시지를 업데이트하는 동안 오류가 발생했습니다.

로키

다음 단계를 수행하기 위해 WCF 서비스에 도달하기 전에 SOAP 메시지를 가로 채야합니다.

  • 클라이언트가 SOAPAction 값을 제공 할 수 없으므로 메시지를 올바른 메서드로 라우팅합니다.
  • 클라이언트가 메시지에 네임 스페이스 정보를 추가 할 수 없으므로 xml의 네임 스페이스를 업데이트하십시오.

라우팅은 문제가 아니지만 메시지를 만드는 데 문제가 있습니다. 메시지를 다시 생성하면 본문은 "... Stream ..."으로 만 구성됩니다.

메시지를 작성하기 전에 messageContent 변수에는 유효하고 올바른 xml이 포함됩니다.

private Message UpdateNamespaces(Message message, string methodName)
    {
        var memoryStream = new MemoryStream();
        var xmlWriter = XmlWriter.Create(memoryStream);
        message.WriteMessage(xmlWriter);
        xmlWriter.Flush();

        var messageContent = Encoding.UTF8.GetString(memoryStream.ToArray());
        xmlWriter.Close();

        // Update messageContent with corrected XML

        memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(messageContent));
        var xmlDictionaryReader = XmlDictionaryReader.CreateTextReader(memoryStream, new XmlDictionaryReaderQuotas());
        var newMessage = Message.CreateMessage(xmlDictionaryReader, int.MaxValue, message.Version);
        newMessage.Properties.CopyProperties(message.Properties);

        return newMessage;
    }

messageContent는 memoryStream을 생성 한 시점에서 정확하지만 newMessage.ToString ()의 내용을 확인하자마자 "... Stream ..."본문 내용이 표시됩니다.

누군가 도울 수 있다면 아이디어가 없어서 매우 감사하겠습니다!

많은 감사

어닐

나는 당신이 행동 책임을 혼합하고 있다고 생각합니다.

IDispatchOperationSelector.SelectOperation라우팅 결정을위한 것입니다. 메시지에 대한 참조를 제공하지만 의도는 메시지 속성에 대한 액세스를 활성화하는 것입니다. WCF는이 확장 점을 사용하여 메시지를 수정할 것으로 예상하지 않습니다. 확실하게 말할 수는 없지만 문제는 그렇게 간단 할 수 있습니다.

메시지 네임 스페이스를 변경하려면 IDispatchMessageInspector 를 사용해야합니다 . 그 작업에 대한 두 번째 동작을 만드는 것이 좋습니다. 다음은 좋은 메시지 검사기 예제 입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관