我知道这有点像重新发明轮子,但我需要知道通过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,那也会有所帮助。
答案 0 :(得分:7)
如果你想直接沟通,我会考虑使用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 = @"<?xml version=""1.0"" encoding=""utf-8""?>
<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
xmlns:xsd=""http://www.w3.org/2001/XMLSchema""
xmlns:soap=""http://www.w3.org/2003/05/soap-envelope"">
<soap:Body>
<SayHello xmlns=""http://tempuri.org/"">
<name>My Name Here</name>
</SayHello>
</soap:Body>
</soap:Envelope>";
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。
答案 1 :(得分:1)
所选答案的代码对我不起作用。我必须在标头中添加SOAPAction
并更改ContentType
。
以下是整个代码:
var strRequest = @"<soap12:Envelope>
...
</soap12:Envelope>";
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")
};
答案 2 :(得分:0)
有XML-RPC.NET允许即时创建绑定。
E.g。 (来自他们网站的一个例子):
[XmlRpcUrl("http://betty.userland.com/RPC2")]
public interface IStateName : IXmlRpcProxy
{
[XmlRpcMethod("examples.getStateName")]
string GetStateName(int stateNumber);
}
答案 3 :(得分:0)
如果您的服务非常简单,那么只需使用“添加服务参考”并使用代理。
如果这不起作用,请使用命令行svcutil.exe程序并发布它打印的错误消息。
除非您别无选择,否则请勿使用WSDL.EXE。