.Net - 在没有WSDL的情况下使用Web服务

时间:2011-05-23 11:59:19

标签: c# web-services xsd

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

然而,为了简化请求的创建和解析响应,我想创建某种自动化功能。我在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 个答案:

答案 0 :(得分:1)

好吧,如果你真的无法掌握一个合适的WSDL文件但是有XSD:s你可以使用xsd.exe工具来创建映射到你的请求和响应类型的类。

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

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

但实际上,尽量找到WSDL,它会让你的生活更轻松......

答案 1 :(得分:0)

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

做到这一点的方法:

  1. 获取webservice使用的确切请求和响应的线索。使用Fiddler或类似的东西。

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

  3. 获取

  4. 的踪迹
  5. 比较(3)到(1)。请记住,您希望XML信息集等效。例如,您的名称空间前缀不必相同。您的命名空间不需要在同一位置声明。但是,元素名称必须完全相同,并且xmlns字符串需要完全相同。修改WCF服务以更紧密地匹配原始服务。重新启动它,转到步骤3.尽可能多地迭代。

  6. 将您的WCF客户端指向真实的Web服务

  7. 高枕无忧。

  8. 我已经完成了这项工作。如果您不了解DataContract属性如何影响线路上的XML,则可能会非常棘手。但是当你玩它时,你会很快获得洞察力。

    但它如何成为SOAP服务并且服务端没有WSDL呢?它可能会为您节省大量工作来重新定位真正的WSDL。