2017-03-11 31 views
0

添加wcf引用:文件Reference.cs無法生成[System.Runtime.Serialization.DataContractAttribute(Name =「ClassName」,Namespace =「...」],但在類名(DataContract)的頂部生成[System.Xml.Serialization.XmlTypeAttribute(Namespace =「...」)] )例如: enter image description here 但我想讓Reference.cs產生下面的代碼:添加wcf引用:文件Reference.cs無法生成[System.Runtime.Serialization.DataContractAttribute(Name =「ClassName」,Namespace =「...」]

enter image description here

怎麼辦呢 如果是[System.Xml.Serialization.Xm lTypeAttribute(Namespace =「...」)],wcf傳輸參數ClassName的實例原因ClassName的Int32 FieldName = 0. 但如果它是[System.Runtime.Serialization.DataContractAttribute(Name =「ClassName」,Namespace =「... 「],wcf傳遞參數ClassName的實例可以得到正確的值。

如何解決?

我的服務器接口:

enter image description here

我的模型:

enter image description here

+0

您的WSDL與DataContractSerilizer不兼容。 https://msdn.microsoft.com/zh-cn/library/ms731923(v=vs.110).aspx - 它回落在XmlSerializer上 –

+0

感謝您的回覆!但是我的模型是[DataContract],爲什麼自動生成XmlTypeAttribute,如何解決它? – Superman

+1

此外,請刪除代碼的屏幕截圖,並將問題中的實際代碼。閱讀非常困難。 –

回答

3

DataContract串行器是WCF的默認。爲什麼有XML串行器在你的情況下使用了幾種可能的原因:

  1. 如果架構與DataContractSerializer的兼容,XmlSerializer的選擇。詳情請查閱article

  2. 屬性XmlSerializerFormat被應用在服務

你能檢查上述要點之一是你的情況? 如果它不爲你工作,請爲UserPrivilegeInfo提供的定義和服務合同(包括接口和實現類)

UPDATE:

好了,現在我們已經確定了強制使用的XmlSerializer的是由返回的DataSet引起的。

從WCF服務返回DataSet通常是一個糟糕的做法。 這些文章解釋了爲什麼:

Returning DataSets from WebServices is the Spawn of Satan and Represents All That Is Truly Evil in the World

Why returning dataset or data table from WCF service is not a good practice? What are the Alternatives?

考慮返回DTO(數據傳輸對象),而不是雜亂的數據集。您只需填寫DataSet中的DTO字段並將DTO傳輸到客戶端即可。客戶端通過強類型的DTO訪問數據,如Id,Name等。

在你的情況重新定義方法GetCenterWebUser()以下列方式:

[DataContract] 
    public class CenterWebUser 
    { 
     [DataMember] 
     public string Name { get; set; } 

     [DataMember] 
     public string Email { get; set; } 

     // Other fields for the user 
    } 

    public class SomeService : ISomeService 
    { 
     public CenterWebUser GetCenterWebUser() 
     { 
      DataSet ds = ...; 

      var userTable = ds.Tables["Users"]; 
      var userRow = userTable.Rows[0]; 

      return new CenterWebUser() 
      { 
       Name = userRow.Field<string>("Name"), 
       Email = userRow.Field<string>("Email") 
       // ... 
      }; 
     } 
    } 
} 
+0

我上傳了我的服務器接口和模型?你能幫助我嗎?謝謝! – Superman

+0

在圖片中,UserPrvilegeInfo信息被剪切。 DownloadNum是DataContract中的最後一個字段嗎?是否可以複製/粘貼實際的代碼片段,而不是代碼截圖? – CodeFuller

+0

非常感謝! – Superman

2

您使用DataSet作爲返回類型。這幾乎肯定是WCF回落到XmlSerializer而不是使用DataContractSerializer的原因。

DataContractSerializer關於它支持的序列化類型有嚴格的rules,關於支持XSD的更嚴格的rules。通過在服務範圍內包含暴露DataSet,您幾乎肯定會違反這些規則。

  1. 刪除DataSet。
  2. 你是金!

另一件事 - 爲什麼它對你來說至關重要你的服務引用的聲明屬性是指XmlTypeAttribute還是DataContractAttribute?這對消費者無關緊要。

您是否有權限訪問該服務代碼?如果我是你,我會放棄服務參考,直接使用ChannelFactory<T>直接使用服務。服務參考號是complex, unpredictable, indirect, and often do not work

一旦您從返回類型中刪除了可笑的DataSet,當然。

+0

在粘貼的代碼中,DataContract中沒有DataSet成員。此外,我創建了測試WCF服務,返回帶有DataSet字段的DataContract,並且默認情況下使用DataContract序列化程序進行序列化。 – CodeFuller

+0

@CodeFuller你有沒有嘗試過使用返回數據集的操作? –

+0

是的,我已經在超人的代碼中嘗試過了。 – CodeFuller

相關問題