2011-07-17 69 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服務並找出通信問題的真正原因。 –