2009-11-09 90 views
5

“添加服务引用”的问题,实际上与SvcUtil的所有功能有关。 为了再现你只需要与参数或返回下面的类添加OperationContract的:WCF AddServiceReference导致自定义工具错误,不生成代理

[XmlSchemaProvider("MySchema")] 
public class MyStructure : IXmlSerializable 
{ 
    private XmlElement e; 

    private static void Func(object o, ValidationEventArgs args) 
    { 
    } 

    public static XmlQualifiedName MySchema(XmlSchemaSet xs) 
    { 
     //xs.XmlResolver = new XmlUrlResolver();    
     XmlSchema s = XmlSchema.Read(new XmlTextReader(new StringReader("<?xml version=\"1.0\"?><xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"><xs:complexType name=\"MyStructure\"><xs:sequence><xs:any /></xs:sequence></xs:complexType></xs:schema>")), null); 

     xs.Add(s); 
     return new XmlQualifiedName("MyStructure"); 
    } 

    #region IXmlSerializable Members 

    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     throw new NotImplementedException(); 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     XmlDocument doc = new XmlDocument(); 
     e = (XmlElement)doc.ReadNode(reader); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     e.WriteTo(writer); 
    } 

    #endregion 
} 

的结果是,当您使用AddWebReference或AddSerivceReference不含有MYSTRUCTURE类型的类库,一切参考将罚款广告,你会得到一个xmlElement表示在自动创建的代理。

然而,当你有一个参考,你会得到以下警告:

================

警告1个自定义工具警告:不能导入wsdl:portType 详细信息:运行WSDL导入扩展时引发异常:System.ServiceModel.Description.DataContractSerializerMessageContractImporter 错误:引用类型'ServiceLibrary.MyStructure,ServiceLibrary,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'数据合同名称'名称空间中的'MyStructure''不能使用,因为它与导入的DataContract不匹配。需要从引用类型中排除此类型。 XPath to Error来源:// wsdl:definitions [@ targetNamespace ='http://tempuri.org/']/wsdl:portType [@ name ='IService1'] \ Projects \ WCFSample \ WCFExample \ TestAddReference \ Service References \ ServiceReference1 \ Reference.svcmap 1 1 TestAddReference

======================

而且没有代理会为你生成。

现在,当您有一个通用的DataContract和/或使用IsReference属性时,互联网充满了对此的描述。

这是一个非常严重的问题,因为任何非类型的数据都会造成这个问题。 找不到解决问题的方法。如果我想通过分享合同的类库来了解客户端的类型,该怎么办?

+4

我希望我知道这个答案。我现在正在与VS2010打一场几乎相同的问题。根据我的经验,在svcutil.exe中生成适当的WSDL以供消费时,WCF多年来一直不稳定且不可靠,并且它在VS2010中尚未得到修复,这让人感到很失望。微软没有人真的使用这种技术?因为我不能设置WCF服务而不会遇到这个问题或其他一些密切相关的问题。 – 2010-01-05 04:02:26

+1

MICROSOFT请修复此问题! (或者我去Java) – capdragon 2011-03-02 21:40:32

回答

0

这种类型的异常通常意味着服务生成的类型契约与引用类型(如消息指出的!)相比至少有一处不同。但我乍看之下可能并不明显,正如我发现的那样。确保所有嵌套和引用类型都与服务器保持同步。就我而言,嵌套类型在服务器上进行了更新。我以为我已经更新了本地引用的程序集(和共享引用类型),但我错过了一些。它仔细检查发现的罪魁祸首。

this question

0

其他信息我有一个建议:
我有类似的错误,包括:

the .svcmap file cannot be found. It may have been moved or deleted. To generate a new .svcmap file, delete the service reference and add it again.

而在这一点上,没有办法删除服务引用,除非我关闭VS2010并再次打开它。

这种情况是:我的WCF服务正在运行,我在我定义的HTTP地址上编程添加了一个Description.ServiceMetadataBehavior

VS2010,我尝试在HTTP地址添加服务引用,我看到我的服务,我添加了引用,以及瞧,错误和警告。

问题:我的HTTP地址包含一些WCF不喜欢的关键词。具体来说,这个词COM(它也与LPT一起)。

所以我的解决方案:修改我的HTTP地址不要有单词COM。它为我工作。

0

如果服务托管在HTTPS上,请进入服务器的IIS管理器。在该站点的“SSL设置”下,确保选中“需要SSL”,然后选中客户证书单选按钮以显示“接受”。

相关问题