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

时间:2010-12-30 16:31:17

标签: c# .net web-services webrequest

我知道这有点像重新发明轮子,但我需要知道通过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,那也会有所帮助。

4 个答案:

答案 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。