2009-12-07 186 views
6

我正在用C#编写Web服务客户端,不想创建和序列化/反序列化对象,而是发送和接收原始XML。发送和接收SOAP消息

这是可能的C#?

+0

你真的需要SOAP吗,还是你只想来回发送XML? – 2009-12-07 21:34:58

回答

1

你可以让你的web服务方法返回一个包含xml的字符串,但是要注意上面关于使事情更容易出错的注释。

2

是 - 你可以简单地声明输入和输出XmlNode

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

可以使用System.Net类,如HttpWebRequest和HttpWebResponse直接读取和写入HTTP连接。

下面是一个基本的(非临时的,未编译的,非错误检查,严重过度简化的)示例。可能不是100%正确,但至少会给你一个它是如何工作的想法:

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... 

这种方法效果很好。 但是不管你需要做什么都可以通过继承现有的代理类并覆盖你需要具有不同行为的成员来完成。这种类型的东西最适合在没有其他选择的情况下使用,这在我的经验中并不常见。

+0

+1感谢您的帖子。我也发布了我的实施建议。 – CRice 2010-08-17 03:21:03

+2

对五岁答案的随机downvote?任何解释? – 2014-07-02 14:41:04

4

这是我刚刚根据John M Gant的例子运行的一个实现的一部分。设置内容类型请求标头很重要。另外我的请求需要凭据。

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

感谢分配,但如何使用它? – 2011-01-25 09:17:02

+0

WebRequest请求= CreateRequest(soapMessage); – CRice 2011-01-26 22:57:16

+0

WebResponse webResponse = request.GetResponse(); – CRice 2011-01-26 22:58:02