我在C#中编写Web服务客户端,不想创建和序列化/反序列化对象,而是发送和接收原始XML。
这在C#中是否可行?
答案 0 :(得分: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; }
}
答案 1 :(得分:2)
是的 - 您可以简单地将输入和输出声明为XmlNode
的
[WebMethod]
public XmlNode MyMethod(XmlNode input);
答案 2 :(得分: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...
这种方法效果很好。 但可能通过继承现有代理类并覆盖您需要具有不同行为的成员来完成您需要做的任何事情。这种类型的东西最好保留给你别无选择的时候,这在我的经验中并不常见。
答案 3 :(得分:1)
您可以让您的Web服务方法返回包含xml的字符串,但请注意上面的注释,使其更容易出错。