如何以编程方式将信息发送到C#with .NET中的Web服务?

我知道这有点像重新发明轮子,但我需要知道通过http / soap / xml和Web消息与Web服务进行通信。 原因是我需要与第三方Web服务进行通信才能工作,但是WSDL或其他东西有问题,并且在使用.NET向导连接它时它不起作用。

所以,任何人都可以给我一个过程/简单的例子/等。 怎么做或任何人都可以给我一个解释它的地方的链接? 我对网络请求和响应并不十分了解。

如何构建和发送请求? 我该如何解析回复?

这是一个简单的Web服务的代码。 假装.asmx的地址是“http://www.mwebb.com/TestSimpleService.asmx”:

using System; using System.Data; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; namespace TestSimpleService { [WebService] public class Soap : System.Web.Services.WebService { [WebMethod] public string SayHello(string name) { return "Hello " + name + "!"; } } } 

我怎么称呼这种方法?

任何帮助表示赞赏。

编辑

我真的只是想知道如何将数据发送到Web服务。 我可以获取所有方法/ SOAP操作/ URL数据,我可以解析响应数据。 我只是不知道使用什么对象或如何使用它们。

如果有人知道一些简单的.NET SOAP客户端,比如Python中的SUDS,那也会有所帮助。

如果你想直接沟通,我会考虑使用HTTPWebRequest,因为最终webservice调用只是使用HTTP POST发送的XML。

以下链接有一些示例: http : //geekswithblogs.net/marcel/archive/2007/03/26/109886.aspx

作为在使用.net以编程方式联系之前测试外部Web服务的一种方法,一种方法是使用像SOAPUI这样的测试工具来生成您认为需要发布到Web服务的确切XML并使用该工具手动发送它

然后你可以开发.net等价物

编辑 – 这是一个简单的例子我根据上面的链接调用你的示例服务(使用SOAP1.2):

  { string soap = @"    My Name Here   "; HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:2439/Soap.asmx"); req.ContentType = "application/soap+xml;"; req.Method = "POST"; using (Stream stm = req.GetRequestStream()) { using (StreamWriter stmw = new StreamWriter(stm)) { stmw.Write(soap); } } WebResponse response = req.GetResponse(); Stream responseStream = response.GetResponseStream(); // Do whatever you need with the response Byte[] myData = ReadFully(responseStream); string s = System.Text.ASCIIEncoding.ASCII.GetString(myData); } 

ReadFully方法来自http://www.yoda.arachsys.com/csharp/readbinary.html ,看起来它起源于Jon Skeet。

所选答案的代码对我没有用。 我不得不在标头中添加SOAPAction并更改ContentType

这是整个代码:

 var strRequest = @" ... "; string webServiceUrl = "http://localhost:8080/AccontService.svc"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(webServiceUrl); request.Method = "POST"; request.ContentType = "text/xml;charset=UTF-8"; request.Accept = "text/xml"; request.Headers.Add("SOAPAction", "http://tempuri.org/IAccountService/UpdateAccount"); byte[] data = Encoding.UTF8.GetBytes(strRequest); request.ContentLength = data.Length; Stream requestStream = request.GetRequestStream(); requestStream.Write(data, 0, data.Length); requestStream.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); string responseXmlString = reader.ReadToEnd(); return new HttpResponseMessage() { Content = new StringContent(responseXmlString, Encoding.UTF8, "application/xml") }; 

XML-RPC.NET允许动态创建绑定。

例如(来自他们网站的一个例子):

 [XmlRpcUrl("http://betty.userland.com/RPC2")] public interface IStateName : IXmlRpcProxy { [XmlRpcMethod("examples.getStateName")] string GetStateName(int stateNumber); } 

如果您的服务真的像您的示例一样简单,那么只需使用“添加服务引用”并使用代理。

如果这不起作用,请使用命令行svcutil.exe程序并发布它打印的错误消息。

除非您别无选择,否则请勿使用WSDL.EXE。