2009-08-24 91 views
1

我創建的暴露具有一個paramater的方法的WCF服務:WCF服務參數改變在.NET 2.0客戶端

public class Service1 : IService1 
{ 
    public string GetData(int value) 
    { 
     return string.Format("You entered: {0}", value); 
    } 
} 

服務已兩個端點定義(和的wsHttpBinding basicHttpBinding的),因此,這將是compatable與年長的客戶。

該服務在.NET 3.0和.NET 3.5客戶端應用程序中運行得很好。但是,當我創建.NET 2.0客戶端時,GetData方法需要2個參數:一個整數(預期)和一個名爲valueSpecified(意外)的bool參數。我從來沒有定義第二個參數。爲什麼會發生這種情況,我如何擺脫第二個參數?

回答

3

由於值類型不能爲空(在.net框架的後面版本中沒有Nullable<T>)VS除了生成額外的參數以使您無法指定值類型之外,您可以調用您的服務方法。

service.GetData(val,true); 

看到this後,在約翰·桑德斯建議加上[DataMember(Required = true)]屬性在屬性。

+0

這不是和你鏈接的問題完全相同的問題。在這種情況下,客戶端是.NET 2.0,其中包含Nullable 類。然而,解決方案仍然適用。 – 2009-08-24 10:15:06

0

您可以手動從代理類中的GetData操作中刪除valueSpecified屬性。

+2

只有當客戶端代理將來不需要重新生成時,這將是一個可行的解決方法。否則,通過所有生成的方法簽名來刪除每次額外的參數將是一件痛苦的事情。 – 2009-08-24 08:16:30

1

完全相同的問題已發佈here

的另一種方式,以避免額外的布爾參數對客戶機代理時使用.NET 2.0是在服務合同切換到RPC樣式enconding生成(默認爲既WCF和ASMX是文檔風格) 。
這樣,客戶端上的XmlSerializer將確保參數始終出現在SOAP請求中,因爲它是SOAP 1.1規範的一部分,這是在使用RPC樣式編碼時強制執行的。

在WCF中,您可以使用DataContractFormat屬性在服務或操作級別指定編碼風格。

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    [DataContractFormat(Style = OperationFormatStyle.Rpc)] 
    string GetData(int value); 
} 

有關SOAP中RPC樣式和文檔樣式編碼之間差異的更多信息,請參閱here

無論如何,請仔細考慮更改服務合同的含義,因爲它可能會破壞與任何現有客戶的兼容性。