我指的是Visual Studio 2005附带的.Net命令行WSDL实用程序,该实用程序是用Java实现的Web服务(我无法控制),它会发出以下错误:
WSDL : error WSDL1: Unable to cast object of type 'System.Xml.XmlElement'
to type 'System.Web.Services.Description.ServiceDescriptionFormatExtension'.
然而,如果我通过“添加Web引用”对话框将Visual Studio 2005本身指向服务,它就会为我生成一个代理类。
我正在使用WSDL实用程序来生成我的所有其他服务代理(尽管旧版本会发出一堆警告)。
目前,我将WSDL实用程序指向已部署的Web服务的URL。所有这些都是用Java开发的。
我想在构建过程中使用WSDL命令行实用程序,以确保每次编译时都拥有最新的代理代码。
答案 0 :(得分:2)
尝试指定选项协议SOAP12
/ protocol:protocol(as show on MSDN)
指定要实施的协议。您可以指定SOAP(默认),HttpGet,HttpPost或配置文件中指定的自定义协议。使用/ parameters选项时,此值是元素并包含字符串。
如果那没有用,那么.......
Visual Studio的“添加Web引用”在添加Web引用时调用WSDL.exe。基本上有no difference,除了从命令行运行WSDL.exe命令时保留的控件。我怀疑你的一个参数是不正确的或与Visual Studio设置的不同。
要对此进行测试,您需要比较生成的2个不同XSD文件的输出,这将为您提供更多关于错误的线索(如Klathzazt建议的那样)。
祝你好运
答案 1 :(得分:0)
这是一个XSD文件吗?文件有依赖项。下载依赖项文件,并将它们放在您下载的XSD旁边/旁边。 我认为visual studio可能会获取依赖项。
如果没有解决,请提供更多详细信息。
答案 2 :(得分:0)
我能够通过使用ServiceBehavior修饰(具体)服务并为其提供命名空间来消除此错误。
using System.ServiceModel;
[ServiceBehavior(Name = "MyConcreteServiceName", Namespace = "http://www.mycompany.com/services/")]
public class MyConcreteService: IMyService
{
}
注意: 通过服务类 上的ServiceBehavior属性 设置(而不是合同(接口))
而不是:
<wsdl:definitions name="MyConcreteServiceName" targetNamespace="http://tempuri.org/">
我明白了:
<wsdl:definitions name="MyConcreteServiceName" targetNamespace="http://www.mycompany.com/services/">