WSDL.exe不是往返的?

时间:2011-07-17 20:23:52

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

无论如何,如果从同一个WSDL生成的客户端和服务无法相互通信,则会遇到更大的问题,然后提供不同的WSDL。如果我们不了解WSDL,那么我们将很难帮助您。

答案 1 :(得分:0)

稍微修改了我的代码向导生成的代码(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属性。 - 我从生成的头文件中的abstrμact服务器端代理类推断出了类,而不是从'WebService'。 - 我删除了WebMethod属性。

经过这些修改后,一切都按预期工作。