2011-05-23 100 views
8

我们有一个新的会计系统,为外部客户端提供web服务接口。我想访问其中一个接口,但没有WSDL,所以我通过使用HttpWebRequest创建了请求,并且它工作正常。.Net - 不使用WSDL的webservice服务

但是为了方便创建请求和解析响应,我想创建某种自动映射函数。我在XSD文件中有请求和响应结构。有任何想法吗?

请求创建:

public void SendRequest() 
{ 
    HttpWebRequest request = CreateWebRequest(); 
    XmlDocument soapEnvelopeXml = new XmlDocument(); 
    soapEnvelopeXml.LoadXml(@"<?xml version=""1.0"" encoding=""utf-8""?> 
     <soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""> 
     <soap:Body xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema""> 

      ++ structure type inserted here ++ 

     </soap:Body> 
     </soap:Envelope>"); 

    using (Stream stream = request.GetRequestStream()) 
    { 
     soapEnvelopeXml.Save(stream); 
    } 

    using (WebResponse response = request.GetResponse()) 
    { 
     using (StreamReader rd = new StreamReader(response.GetResponseStream())) 
     { 
      string soapResult = rd.ReadToEnd(); 
      Console.WriteLine(soapResult); 
     } 
    } 
} 
+2

这很有趣。你有没有尝试过打电话给他们,并问你为什么WSDL? – 2011-05-23 12:06:40

+0

您是否曾尝试在浏览器中打开Web服务,并在URL中添加'?wsdl'? – 2011-05-23 12:08:00

+0

是的,是的。不幸的是没有WSDL。 – Sys 2011-05-23 12:58:48

回答

1

好吧,如果你真的没有得到一个正确的WSDL文件保持的方式,但有XSD:■你很可能使用xsd.exe工具来创建映射到您的请求类和响应类型。

像这样的东西(在Visual Studio命令提示符运行此)

xsd.exe TheRequest.xsd /c /n:Your.Namespace 
xsd.exe TheResponse.xsd /c /n:Your.Namespace 

但实际上,尽力去发现,WSDL,它会让你的生活变得更加简单..

+0

你能解释我可以如何使用生成的类来创建HttpWebRequest? – Sys 2011-05-23 13:03:18

+0

在这里,我正步入一个舒适的区域,但我认为在生成的类上使用XmlSerializer应该让您成为SOAP请求/响应的“消息”部分。 也从新闻组中找到这个旧条目,它可能有一些帮助:http://www.dotnet247.com/247reference/msgs/41/205010.aspx – CodingInsomnia 2011-05-23 17:50:39

0

我建议您创建 WSDL - 对其进行反向工程,然后从中生成您的webservices客户端存根。

的方式做到这一点:

  1. 获取Web服务使用的确切请求和响应的迹线。使用Fiddler或类似的东西。

  2. 构建一个WCF服务,它近似于请求和响应。

  3. 获取的跟踪

  4. 比较(3)(1)。记住你想要XML infoset等价。例如,您的命名空间前缀不必相同。你的名字空间不需要在同一个位置声明。但是,元素名称需要完全相同,并且xmlns字符串需要完全相同。修改WCF服务以更贴近原始。重新启动它,请转到步骤3.根据需要重复多次。

  5. 点的WCF客户端真正的Web服务

  6. 高枕无忧。

我已经做到了这一点,它的工作原理。如果您没有深入了解DataContract属性如何影响线路上的XML,那将会非常棘手。但是当你玩它时,你会很快获得洞察力。

但是它怎么可能是一个SOAP服务,并且服务端没有WSDL?它可以为您节省大量的工作,重新加倍努力找到真正的WSDL。