2009-06-02 5 views
5

Tôi cần liên lạc với ứng dụng cũ từ ứng dụng C# của mình qua Hàng đợi Tin nhắn Windows.Làm cách nào để dừng System.Messaging.MessageQueue của tôi khỏi việc gói các chuỗi của tôi bằng XML?

Ứng dụng kế thừa mong đợi các chuỗi đồng bằng trong một hàng đợi riêng tư cụ thể, nhưng dường như tôi không thể dừng System.Messaging.MessageQueue khỏi gói tin nhắn của tôi trong XML!

Mã tôi là thử nghiệm rất đơn giản:

MessageQueue myQueue = new MessageQueue(@".\Private$\tolegacy"); 
Message msg = new Message("My Test String"); 
myQueue.Send(msg); 

Vấn đề là thông điệp đang được XML serialized và xuất hiện trong hàng đợi như:

<?xml version="1.0"?><string>My Test String</string> 

tôi không thể sửa đổi hành vi của ứng dụng cũ, vì vậy tôi cần phải dừng System.Messaging.MessageQueue khỏi định dạng thư của tôi dưới dạng XML.

Có ai giúp được không?

Trả lời

3

Bạn có thể tạo định dạng của riêng bạn (nó là một lớp mà thực hiện IMessageFormatter và gán nó vào thuộc tính Formatter của tin nhắn

Đây là một link để MSDN đến tài sản Message.Formatter.

tôi đã không cố gắng điều này nhưng bạn sẽ có thể viết tin nhắn của bạn bằng cách sử dụng BodyStream, tôi tin rằng điều này sẽ bỏ qua trình định dạng.

+0

Viết trực tiếp lên BodyStream đã hoạt động, cảm ơn. Nó trông giống như sự thay đổi dễ nhất vì vậy tôi đã thử nó đầu tiên :) – Damovisa

+0

Tôi đã viết một số bản thân mình và họ làm việc thực sự tốt. Điều duy nhất bạn phải lo lắng là người gửi và người nhận hiểu được loại cơ thể. –

+0

Chúng tôi đang gặp sự cố tương tự. Chúng tôi có thể đọc/ghi hàng đợi và nhận lại tin nhắn. Nhưng khi nhà cung cấp đọc hàng đợi, anh ta thấy thêm "thứ" bao quanh thông điệp của chúng tôi. Làm thế nào chúng ta có thể viết một chuỗi đơn giản mà không có gói nào cả? Ngay cả BinaryFormatter cũng đã thêm một loạt các byte vào đầu chuỗi. – NealWalters

3

Sử dụng ActiveXMessageFormatter sẽ cho bạn kết quả như mong muốn. chuỗi thành hàng đợi và có người nghe s đọc trong cơ thể như một chuỗi. ActiveXMessageFormatter được sử dụng để tuần tự hóa/deserializing các loại dữ liệu nguyên thủy và sẽ không đặt một wrapper XML trên đầu vào của bạn như là trường hợp với mặc định XmlMessageFormatter.

mq.Formatter = new ActiveXMessageFormatter(); 

Here là một liên kết khác mô tả 3 trình định dạng khác nhau.