2009-07-16 85 views
0

我使用VSTS 2008 + .Net + C#3.5開發WCF服務(自託管爲Windows服務)。從客戶端,我使用ChannelFactory連接到WCF服務。我的困惑是,當我將客戶端代碼從「public string response」更改爲「public string responseAliasName」時,responseAliasName的值爲null。但是當變回到變量名稱響應時,響應值是正確的(值是「hi WCF」)。爲什麼我的WCF客戶端獲得空結果?

我的困惑是,我認爲只要從客戶端和服務器端的佈局相同,變量名就不重要。任何想法有什麼不對?

服務器端代碼:

namespace Foo 
{ 
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config. 
    [ServiceContract] 
    public interface IFoo 
    { 
     [OperationContract] 
     FooResponse Submit(string request); 
    } 

    [DataContract] 
    public class FooResponse 
    { 
     [DataMember] 
     public string response; 
    } 
} 

namespace Foo 
{ 
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file. 
    public class FooImpl : IFoo 
    { 
     public FooResponse Submit(string request) 
     { 
      FooResponse foo = new FooResponse(); 
      foo.response = "hi WCF"; 
      return foo; 
     } 
    } 
} 

客戶端代碼:

namespace Foo 
{ 
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config. 
    [ServiceContract] 
    public interface IFoo 
    { 
     [OperationContract] 
     FooResponse Submit(string request); 
    } 

    [DataContract] 
    public class FooResponse 
    { 
     [DataMember] 
     // public string responseAliasName; 
     public string response; 
    } 
} 


namespace FooTestClient1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ChannelFactory<IFoo> factory = new ChannelFactory<IFoo>(
       "IFoo"); 
      IFoo f = factory.CreateChannel(); 
      FooResponse response = f.Submit("Hi!"); 

      return; 
     } 
    } 
} 

回答

2

你可以在服務器端使用

[DataContract(Name="ResponseAliasName")] 
public string response; 

,也將努力爲您想到,DataContract默認使用的字段或屬性名稱序列化數據,並且服務器無法找到正確的數據

+0

您的解決方案工作,很酷!謝謝ArsenMkrt! – George2 2009-07-16 09:40:39

1

沒有,成員名稱包含在序列化。如果您在客戶端更改它,則無法反序列化回該成員。

1

喬治,爲什麼不使用「添加服務參考」來創建你的客戶?如您所見,手動創建客戶端服務合約是危險的。

+0

我已經看到了場景,特別是在處理REST WCF時,依賴svcutil創建合同將是一個糟糕的主意。 – 2016-09-25 15:05:03

1

我的困惑是,當 我從「公共 字符串響應」到「公共字符串 responseAliasName」更改客戶端代碼, responseAliasName的值爲null。但是,當 更改回變量名稱響應, 響應值是正確的(值 是「hi WCF」)。 我的困惑是,我認爲變量名 應該無關緊要,只要 佈局是相同的從客戶端和 服務器端。任何想法有什麼不對?

您在客戶端本地使用的變量名完全不相關 - 服務器對此一無所知。鑑於來自客戶端的代碼片段:

ChannelFactory<IFoo> factory = new ChannelFactory<IFoo>("IFoo"); 
IFoo f = factory.CreateChannel(); 
FooResponse response = f.Submit("Hi!"); 

這將工作 - 沒有問題:

FooResponse myResponseVar1 = f.Submit("Hi!"); 

,因此將這樣的:

FooResponse someReallyCleverVariableNameWhateverItMightBe = f.Submit("Hi!"); 

但當然DataContract共享元素服務和客戶端必須達成一致!畢竟,您無法在本地更改數據合同中元素的名稱,這就是真正描述您的調用將如何轉換爲XML消息的原因,並且這些零碎必須在服務器和客戶端之間保持同步以便客戶端能夠將從服務器收到的消息重新轉換爲對象供您使用。

ServiceContract和DataContract 必須在兩端都是相同的 - 這是基本要求,否則幾乎什麼都不做。

Marc

相關問題