2017-11-22 12 views
1

서비스 버스에 메시지를 넣고 레거시 .NET 4.6 수신기에서 읽을 필요가있는 응용 프로그램에 .NET Core 2를 사용하고 있습니다. 수신기는 다른 레거시 응용 프로그램의 메시지도 수신합니다.Azure 서비스 버스 - BrokeredMessage.GetBody를 사용하여 .NET Core 2에서 보낸 메시지 읽기

레거시 발신자 :

UserData obj = new UserData() 
{ 
    id = 1, 
    name = "Alisha" 
}; 
BrokeredMessage message = new BrokeredMessage(consentInstated); 
_client.Send(message); 

레거시 수신기 :

var dataObj = objBrokeredMessage.GetBody<UserData>(); 
businessFunc(dataObj.id, dataObj.name); 

.NET 코어 2 송신기 :https://stackoverflow.com/a/45069423/1773900

var ser = new System.Runtime.Serialization.DataContractSerializer(typeof(UserData)); 
var ms = new MemoryStream(); 
ser.WriteObject(ms, objUserData); 
var message = new Message(ms.ToArray()); 
_client.Send(message); 
,617,451에 기재된

그러나, 리시버는 메시지를 역 직렬화하는 데 실패하고 다음 오류를

System.Runtime.Serialization.SerializationException 예외 : userdata 형의 객체를 직렬화 복원 오류가 발생했습니다. 입력 소스가 올바르게 포맷되지 않은 입니다. ---> System.Xml.XmlException : 입력의 형식이 잘못되었습니다.

두 수신자를 동일한 수신자와 함께 사용하려면 어떻게해야합니까?

+0

는 상기와 동일하게 보이는 https://stackoverflow.com/a/45069423/122195 – thepirat000

+0

본인은 링크에서 설명한 것과 동일한 전략을 사용했습니다. GetBody()는 여전히 구문 분석 오류를 발생시킵니다. – lohiarahul

답변

2

BrokeredMessage은 XML Binary Reader를 사용하여 메시지를 deserialize합니다.

var ser = new DataContractSerializer(typeof(UserData)); 
var ms = new MemoryStream(); 
XmlDictionaryWriter binaryDictionaryWriter = XmlDictionaryWriter.CreateBinaryWriter(ms); 
ser.WriteObject(binaryDictionaryWriter, obj); 
binaryDictionaryWriter.Flush(); 
var message = new Message(ms.ToArray()); 
+2

이제 수신기에서 개체를 구문 분석 할 수 있지만 값이 손실되고 속성이 모두 null로 설정됩니다. – lohiarahul

+0

데이터가 serialize되는 방식에 문제가있는 것 같습니다. 형성된 바이트 배열은 BrokeredMessage가 생성하는 것과 다릅니다. – lohiarahul

+1

@lohiarahul 방금 테스트 한 후 새 클라이언트에서 기존 클라이언트로 내 코드로 작업합니다. 메시지의 차이점을 파악할 수 있습니까? ('Stream'을 받고,'string'으로 변환하여 비교하십시오)? 예 : 메시지 클래스가 다른 네임 스페이스에있을 수 있습니까? – Mikhail

1

우리는 .NET의 핵심 측면에서 직접 직렬화 된 JSON 객체 문자열을 보낼 수 있습니다, 우리는 .NET 측의 코드를 다음과 같이 메시지를 얻을 수 : 그래서 당신의 전송 부분은 다음과 같아야합니다. 그것은 내 편이 제대로 작동합니다.

var dataObj = message.GetBody<UserData>(new DataContractJsonSerializer(typeof(UserData))); 

.NET 코어 측 송신 메시지 코드 :

var body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(objUserData)); 
_client.SendAsync(new Message{Body = body,ContentType = "text/plain"}).Wait(); 

.NET 측 메시지 코드를 수신 :

var dataObj = message.GetBody<UserData>(new DataContractJsonSerializer(typeof(UserData)));