2009-12-07 69 views
6

Tôi đang viết một ứng dụng khách dịch vụ web trong C# và không muốn tạo và tuần tự hóa/deserialize các đối tượng, mà là gửi và nhận XML thô.Gửi và nhận tin nhắn SOAP

Điều này có thể thực hiện được trong C# không?

+0

và bạn có thực sự cần SOAP hay bạn chỉ muốn gửi XML qua lại? –

Trả lời

1

Bạn có thể có phương thức dịch vụ web trả về một chuỗi chứa xml, nhưng hãy chú ý đến nhận xét ở trên về việc làm cho mọi thứ dễ bị lỗi hơn.

2

Có - bạn chỉ có thể tuyên bố các đầu vào và đầu ra như XmlNode 's

[WebMethod] 
public XmlNode MyMethod(XmlNode input); 
2

Bạn có thể sử dụng các lớp System.Net, chẳng hạn như HttpWebRequest và HttpWebResponse để đọc và ghi trực tiếp để kết nối HTTP.

Dưới đây là ví dụ cơ bản (tắt, không được biên dịch, không kiểm tra lỗi, quá minh họa). Có thể không chính xác 100%, nhưng ít nhất sẽ cung cấp cho bạn ý tưởng về cách hoạt động:

HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create(url); 
req.ContentLength = content.Length; 
req.Method = "POST"; 
req.GetRequestStream().Write(Encoding.ASCII.GetBytes(content), 0, content.Length); 
HttpWebResponse resp = (HttpWebResponse) req.getResponse(); 
//Read resp.GetResponseStream() and do something with it... 

Cách tiếp cận này hoạt động tốt. Nhưng cơ hội là bất cứ điều gì bạn cần làm có thể được thực hiện bằng cách kế thừa các lớp proxy hiện có và ghi đè các thành viên bạn cần phải có hành vi khác nhau. Loại điều này là tốt nhất dành riêng cho khi bạn không có sự lựa chọn khác, mà không phải là rất thường xuyên trong kinh nghiệm của tôi.

+0

+1 cảm ơn bài đăng. Tôi cũng đăng bài thực hiện đề xuất của bạn. – CRice

+2

Trả lời ngẫu nhiên về câu trả lời 5 tuổi? Có lời giải thích nào không? –

4

Đây là một phần của triển khai mà tôi vừa chạy dựa trên ví dụ của John M Gant. Điều quan trọng là đặt tiêu đề yêu cầu loại nội dung. Cộng với yêu cầu thông tin đăng nhập của tôi.

protected virtual WebRequest CreateRequest(ISoapMessage soapMessage) 
{ 
    var wr = WebRequest.Create(soapMessage.Uri); 
    wr.ContentType = "text/xml;charset=utf-8"; 
    wr.ContentLength = soapMessage.ContentXml.Length; 

    wr.Headers.Add("SOAPAction", soapMessage.SoapAction); 
    wr.Credentials = soapMessage.Credentials; 
    wr.Method = "POST"; 
    wr.GetRequestStream().Write(Encoding.UTF8.GetBytes(soapMessage.ContentXml), 0, soapMessage.ContentXml.Length); 

    return wr; 
} 

public interface ISoapMessage 
{ 
    string Uri { get; } 
    string ContentXml { get; } 
    string SoapAction { get; } 
    ICredentials Credentials { get; } 
} 
+0

Cảm ơn tất cả, nhưng làm thế nào để sử dụng nó? –

+0

Yêu cầu WebRequest = CreateRequest (soapMessage); – CRice

+0

WebResponse webResponse = request.GetResponse(); – CRice

Các vấn đề liên quan