我正在尝试编写一个可以从webserive调用web方法的函数,给出方法的名称和webservice的URL。我在博客上发现了一些代码,除了一个细节之外,这样做很好。它还要求提供请求XML。这里的目标是从Web服务本身获取请求XML模板。我确信这是可能的,因为如果我在浏览器中访问webservice的URL,我可以看到请求和响应XML模板。
这是以编程方式调用webmethod的代码:
XmlDocument doc = new XmlDocument();
//this is the problem. I need to get this automatically
doc.Load("../../request.xml");
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost/dummyws/dummyws.asmx?op=HelloWorld");
req.ContentType = "text/xml;charset=\"utf-8\"";
req.Accept = "text/xml";
req.Method = "POST";
Stream stm = req.GetRequestStream();
doc.Save(stm);
stm.Close();
WebResponse resp = req.GetResponse();
stm = resp.GetResponseStream();
StreamReader r = new StreamReader(stm);
Console.WriteLine(r.ReadToEnd());
答案 0 :(得分:2)
继上述评论之后。如果您有一个描述您的服务的WSDL文件,则将其用作与Web服务通信所需的信息。
使用代理类与服务代理进行通信是一种从HTTP和XML的底层管道中抽象出来的简单方法。
有一些方法可以在运行时执行此操作 - 实质上是在您向项目添加Web服务引用时生成Visual Studio生成的代码。
我使用的解决方案基于:this newsgroup question,但也有other examples out there。
答案 1 :(得分:0)
仅供参考,您的代码缺少using
块。应该更像这样:
XmlDocument doc = new XmlDocument();
//this is the problem. I need to get this automatically
doc.Load("../../request.xml");
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost/dummyws/dummyws.asmx?op=HelloWorld");
req.ContentType = "text/xml;charset=\"utf-8\"";
req.Accept = "text/xml";
req.Method = "POST";
using (Stream reqstm = req.GetRequestStream())
{
doc.Save(reqstm);
}
using (WebResponse resp = req.GetResponse())
{
using (Stream respstm = resp.GetResponseStream())
{
using (StreamReader r = new StreamReader(respstm))
{
Console.WriteLine(r.ReadToEnd());
}
}
}