반응형
azure brocredmessage는 타입을 모른 채 몸을 구한다.
Azure Service Bus에서 브로커 메시지를 사용하는 경우 콜을 사용하여 메시지 본문을 가져올 수 있습니다.Get Body.코드는 간단합니다.
var msg = subscription.Receive();
MyPayload payload = msg.GetBody<MyPayload>();
그러나 본문 객체의 클래스를 명시적으로 알지 않고 본문을 회수할 수 있는 방법이 있습니까?
var msg = subscription.Receive();
Type bodyType = Type.GetType( msg.ContentType);
var payload = msg.GetBody<bodyType>();
콘텐츠에 관계없이 메시지 본문만 가져오려는 경우 스트림으로 가져올 수 있습니다.
Stream stream = message.GetBody<Stream>();
StreamReader reader = new StreamReader(stream);
string s = reader.ReadToEnd();
다음으로 brocred 메시지에서 역직렬화하는 완전한 코드를 나타냅니다.
public T GetBody<T>(BrokeredMessage brokeredMessage)
{
var ct = brokeredMessage.ContentType;
Type bodyType = Type.GetType(ct, true);
var stream = brokeredMessage.GetBody<Stream>();
DataContractSerializer serializer = new DataContractSerializer(bodyType);
XmlDictionaryReader reader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max);
object deserializedBody = serializer.ReadObject(reader);
T msgBase = (T)deserializedBody;
return msgBase;
}
내용 전 샘플체형을 감지하는 데 사용되는 유형입니다.콘텐츠에 대해서유형은 보낸 사람별로 설정해야 합니다.마찬가지로 메시지 속성 중 하나를 송신측 오브젝트 타입으로 설정하고 메시지 속성에서 취득한 타입으로 수신측에서 GetBody <>()를 호출합니다.다음과 같습니다.
public void SendData(object payloadData)
{
if (payloadData == null) return;
var queueClient = QueueClient.CreateFromConnectionString(ConnectionString, _queueName);
var brokeredMessage = new BrokeredMessage(payloadData);
brokeredMessage.Properties["messageType"] = payloadData.GetType().AssemblyQualifiedName;
queueClient.Send(brokeredMessage);
}
메시지 속성 "messageType"에는 유형의 전체 이름이 있습니다.
수신측에서는, 다음과 같이 합니다.
var messageBodyType = Type.GetType(receivedMessage.Properties["messageType"].ToString());
if (messageBodyType == null)
{
//Should never get here as a messagebodytype should
//always be set BEFORE putting the message on the queue
Trace.TraceError("Message does not have a messagebodytype" +
" specified, message {0}", receivedMessage.MessageId);
receivedMessage.DeadLetter();
}
//read body only if event handler hooked
var method = typeof(BrokeredMessage).GetMethod("GetBody", new Type[] { });
var generic = method.MakeGenericMethod(messageBodyType);
try
{
var messageBody = generic.Invoke(receivedMessage, null);
DoSomethingWithYourData();
receivedMessage.Complete();
}
catch (Exception e)
{
Debug.Write("Can not handle message. Abandoning.");
receivedMessage.Abandon();
}
}
언급URL : https://stackoverflow.com/questions/15441853/with-azure-brokeredmessage-get-the-body-without-knowing-the-type
반응형
'programing' 카테고리의 다른 글
| Excel에서 웹 페이지로 복사/붙여넣기 (0) | 2023.04.21 |
|---|---|
| 실행 시 WPF 버튼의 이미지가 표시되지 않음 (0) | 2023.04.21 |
| TextBlock 텍스트가 트리밍되고 있는지 확인하려면 어떻게 해야 합니까? (0) | 2023.04.21 |
| azure 웹 앱 요청 시간 초과 증가 (0) | 2023.04.21 |
| SqlDataReader에서 데이터 읽기 (0) | 2023.04.21 |