【问题标题】:.Net - Consuming webservice without WSDL.Net - 使用没有 WSDL 的 web 服务
【发布时间】:2011-05-23 11:59:19
【问题描述】:

我们有一个新的会计系统,为外部客户提供网络服务接口。我想访问其中一个接口,但没有 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);
        }
    }
}

【问题讨论】:

  • 这很有趣。您是否尝试过打电话给他们并询问您在哪里使用 WSDL?
  • 您是否尝试过在浏览器中打开网络服务,并将?wsdl 附加到 URL 中?
  • 是的,是的。不幸的是没有 WSDL。

标签: c# web-services xsd


【解决方案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,它会让你的生活变得更轻松..

【讨论】:

  • 你能解释一下我如何使用生成的类来创建 HttpWebRequest 吗?
  • 我在这里有点脱离了我的舒适区,但我认为在生成的类上使用 XmlSerializer 应该可以让您获得 SOAP 请求/响应的“消息”部分。还从新闻组中找到了这个旧条目,它可能会有所帮助:dotnet247.com/247reference/msgs/41/205010.aspx
【解决方案2】:

我建议您创建一个 WSDL - 对其进行逆向工程,然后从中生成您的 Web 服务客户端存根。

方法:

  1. 获取网络服务使用的确切请求和响应的线路跟踪。使用提琴手或类似的东西。

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

  3. 获取那个的踪迹

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

  5. 将您的 WCF 客户端指向真正的 Web 服务

  6. 高枕无忧。

我已经这样做了,它有效。如果您不了解DataContract 属性如何影响网络上的 XML,这可能会很棘手。但是当您使用它时,您将很快获得洞察力。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 2021-10-30
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多