我的客户指定了一个WSDL文件作为我必须实现的web服务的约定。(它确实必须是那个WSDL文件,因为它已经被传递给其他合作伙伴,等等,他们也将基于该WSDL实现自己的web服务和客户端。它是一个63KB的WSDL文件。)
使用wsdl.exe,我已经为服务器端创建了代理类。这样我就可以实现web服务了。但是:如果使用wsdl.exe创建基于原始WSDL文件的客户端代理类,则会导致客户端应用程序无法与web服务通信!
相反:通过向web服务URL添加“?WSDL”,我得到了另一个WSDL文件。当使用第二个WSDL文件创建客户端代理类时,这将导致客户端应用程序完全能够与web服务通信。奇怪的是,第二个WSDL文件的大小是288KB,而不是原始WSDL文件的63KB。
因此,这应该意味着WSDL不是双向的…。(WSDL文件-> wsdl.exe创建服务器端代理类-> web服务->将“?WSDL”添加到web服务->会导致另一个WSDL文件与原始文件相同(更糟糕的是:它们不兼容)。)
有人能解释这个吗?(对于我的项目来说,这很重要,因为其他各方将使用原始的WSDL文件,因此它们将无法与我的web服务…通信)
我用C#和CLI做了测试。它是可重现的。我正在使用IIS7.5和.NET Framework3.5。
发布于 2011-07-21 04:44:19
在略微修改了我的代码向导( Visual Studio2008的CLI服务的免费模板,但标准ASP.NET 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);
}
};
}修改如下:-我删除了WebServiceBinding属性。-我从生成的头文件中的abstrµact服务器端代理类中推导出这个类,而不是从‘WebService’中。-我删除了WebMethod属性。
在这些修改之后,一切都像预期的那样工作。
发布于 2011-07-18 04:48:52
原始的WSDL仅用于生成一些存根,没有其他用途。通过将?wsdl添加到服务地址,您可以指示服务为您获取其WSDL文档,但在缺省情况下,它会创建自己的文档。如果你想强制它返回你以前的文档,你必须使用modify your service。
无论如何,如果您的客户机和从相同WSDL生成的服务不能相互通信,那么您就会遇到比提供不同WSDL更大的问题。对于这一部分,如果我们不了解WSDL,我们将很难为您提供帮助。
https://stackoverflow.com/questions/6726547
复制相似问题