发送和接收SOAP消息

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

这可能在C#中吗?

这是我刚刚根据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; } } 

是的 – 您可以简单地将输入和输出声明为XmlNode

 [WebMethod] public XmlNode MyMethod(XmlNode input); 

您可以使用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... 

这种方法效果很好。 但是,您可以通过inheritance现有的代理类并覆盖您需要具有不同行为的成员来完成您需要做的任何事情。 当你别无选择时,最好保留这种类型的东西,这在我的经验中并不常见。

您可以让您的Web服务方法返回包含xml的字符串,但请注意上面关于使事情更容易出错的注释。