2011-07-17 39 views
0

我的客户已经指定了一个WSDL文件作为我必须实现的Web服务的契约。 (它确实必须是WSDL文件,因为它已经被传递给其他合作伙伴等等,并且他们也将基于该WSDL实现他们自己的Web服务和客户端,它是一个63 KB的WSDL文件。)WSDL.exe不是往返?

使用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 - >结果另一个WSDL文件为原始文件(更糟糕的是:它们不兼容)。)

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

我使用C#以及CLI 。它是可重复的。我正在使用IIS 7.5和.NET框架3.5。

+1

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

回答

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文件生成客户端代理类时,客户端应用程序仍然可以向Web服务发送MyClass实例,但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); 
     } 
    }; 
} 

的修改是: - I除去WebServiceBinding属性。 - 我从生成的头文件中的abstrμact服务器端代理类推导出类,而不是从'WebService'。 - 我删除了WebMethod属性。

经过这些修改后,所有工作都按预期工作。

2

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

无论如何,如果您从同一个WSDL生成的客户端和服务无法相互通信,那么您提供的不同WSDL有更大的问题。如果我们不知道WSDL,那么对于那部分我们几乎不会帮助你。

+0

你说得对。客户和服务无法沟通,是更大的问题。但无论如何感谢您的链接[http://www.pluralsight-training.net/community/blogs/craig/archive/2005/12/15/17482.aspx](http://www.pluralsight-training.net/社区/博客/克雷格/存档/ 2005/12/15/17482.aspx)。它帮助我理解更好的Web服务并找出通信问题的真正原因。 –