【问题标题】:WSDL.exe not round-trip?WSDL.exe 不是往返的?
【发布时间】:2011-07-17 20:23:52
【问题描述】:

我的客户指定了一个 WSDL 文件作为我必须实现的 Web 服务的合同。 (确实必须是那个 WSDL 文件,因为它已经传达给其他合作伙伴等等,他们也将基于该 WSDL 实现自己的 Web 服务和客户端。这是一个 63 KB 的 WSDL 文件。)

使用 wsdl.exe,我为服务器端创建了代理类。所以我可以实现网络服务。 但是:如果使用 wsdl.exe 基于原始 WSDL 文件创建客户端代理类,则会导致客户端应用程序无法与 Web 服务通信!

INSTEAD:通过将“?wsdl”添加到 Web 服务 URL,我得到另一个 WSDL 文件。当使用第二个 WSDL 文件来创建客户端代理类时,这会导致客户端应用程序能够完美地与 Web 服务进行通信。奇怪的是,第二个 WSDL 文件的大小为 288 KB,而不是原始 WSDL 文件的 63 KB。

这应该意味着 WSDL 不是往返的……(WSDL 文件 -> wsdl.exe 用于创建服务器端代理类 -> Web 服务 -> 将“?wsdl”添加到 Web 服务 URL -> 导致另一个WSDL 文件作为原始文件(更糟糕的是:它们不兼容)。)

谁能解释一下? (对于我的项目来说这很重要,因为其他方将使用原始 WSDL 文件,因此他们将无法与我的 Web 服务进行通信......)

我使用 C# 和 CLI 进行了测试。它是可重现的。我正在使用 IIS 7.5 和 .NET framework 3.5。

【问题讨论】:

  • 最好发布命令行设置,以及生成的 C 和 S 不匹配的示例。比较文件大小是没有意义的。

标签: c# web-services iis wsdl command-line-interface


【解决方案1】:

您的原始 WSDL 仅用于生成一些存根,仅此而已。通过将?wsdl 添加到服务地址,您可以指示服务获取它的WSDL 文档,但默认情况下它会创建自己的。如果你想强制它返回你以前的文件,你必须modify your service

无论如何,如果您的客户端和从相同 WSDL 生成的服务无法相互通信,那么您将遇到比提供的不同 WSDL 更大的问题。如果我们不了解 WSDL,那么对于这部分内容,我们几乎不会为您提供帮助。

【讨论】:

【解决方案2】:

在稍微修改了我的代码向导生成的代码(Visual Studio 2008 的 CLI ASP.NET Web 服务的免费可用模板,但标准 C# Web 服务模板生成相同类型的代码)后,我得到了类似的东西:

// MyWebService.cpp : main project file.
#include "stdafx.h"
#include "Global.asax.h"
#include "HeaderFileGeneratedByWsdlExe.h"

using namespace System;
using namespace System::Web;
using namespace System::Web::Services;

namespace MyWebService {

    [WebService(Namespace = L"http://MyNamespace.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles::BasicProfile1_1)]
    public ref class MyWebService : public System::Web::Services::WebService
    {
    public:

        [WebMethod(Description = L"myMethod does something")]
        System::Void myMethod(MyClass ^myInstance)
        {
            DoSth(myInstance);
        }
    };
}

“HeaderFileGeneratedByWsdlExe.h”当然是我用wsdl.exe生成的头文件(基于指定的WSDL文件),指定了‘serverInterface’模式。 (在那个头文件中定义了“MyClass”。) 此时可以正确构建 Web 服务并运行它。我可以“发现”我的 Web 服务的 wsdl 文件,为其生成客户端代理类,并实现一个可以与我的 Web 服务正确通信的客户端应用程序。不幸的是,当我使用原始 WSDL 文件生成客户端代理类时,客户端应用程序仍然可以将 MyClass 实例发送到 Web 服务,但 Web 服务无法序列化该 MyClass 实例。

代码必须修改如下:

// MyWebService.cpp : main project file.
#include "stdafx.h"
#include "Global.asax.h"
#include "HeaderFileGeneratedByWsdlExe.h"

using namespace System;
using namespace System::Web;
using namespace System::Web::Services;

namespace MyWebService {

    [WebService(Namespace = L"http://MyNamespace.org/")]
    public ref class MyWebService : public InterfaceFromHeaderFile
    {
    public:

        System::Void myMethod(MyClass ^myInstance)
        {
            DoSth(myInstance);
        }
    };
}

修改如下: - 我删除了 WebServiceBinding 属性。 - 我从生成的头文件中的抽象服务器端代理类而不是从“WebService”中推断出该类。 - 我删除了 WebMethod 属性。

在这些修改之后,一切都按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2014-03-08
    • 2021-05-27
    • 2015-04-02
    • 1970-01-01
    相关资源
    最近更新 更多