2009-11-09 86 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」,然後選中客戶證書單選按鈕以顯示「接受」。

相關問題