发送和接收SOAP消息

7
我正在使用C#编写Web服务客户端,不想创建和序列化/反序列化对象,而是发送和接收原始的XML数据。
在C#中是否有这种可能性?

你真的需要SOAP吗?还是只想来回发送XML? - marc_s
4个回答

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; }
}

非常感谢,但是如何使用它? - Data-Base
创建 WebRequest 请求 = CreateRequest(soapMessage); - CRice
WebResponse webResponse = request.GetResponse(); - CRice
@CRice 在实现 ISoapMessage 接口时,我是否需要创建一个新的 SoapMessage 类? - hellowahab
@hellowahab 只需将接口放在任何类上并传递即可。或者从 CreateRequest 的参数中删除接口,并使用 ISoapMessage 中找到的四个参数之一。 - CRice

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

这种方法很有效。但是,你需要做的任何事情都可以通过继承现有的代理类并覆盖你需要不同行为的成员来实现。在我看来,这种类型的事情最好保留给没有其他选择的时候,而这种情况并不经常发生。


+1 感谢您的帖子。我也发布了您建议的实现。 - CRice

2
是的,您可以将输入和输出声明为 XmlNode
[WebMethod]
public XmlNode MyMethod(XmlNode input);

1

您可以让您的 Web 服务方法返回一个包含 XML 的字符串,但请注意上面的评论,避免使事情变得更容易出错。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接