2013-07-31 26 views
0

我有一個WCF服務,它具有可以接收任何.net序列化客戶端數據的操作。WCF抑制某些操作實現參數的反序列化

[OperationContract] 
void SaveMyData(long id, string name, object serializableData); 

[OperationContract] 
object LoadMyData(long id, string name); 

服務器不需要知道數據是什麼,它只是存儲它或返回存儲的內容。而且服務器甚至不知道被序列化的類型,所以當然這個合約會導致反序列化異常。

我知道我可以序列化/反序列化獨立合同的WCF,例如:

[OperationContract] 
void SaveMyData(long id, string name, byte[] serializedData); 

[OperationContract] 
byte[] LoadMyData(long id, string name); 

但是這需要在客戶端上額外的代碼序列化和反序列化。我想避免這種情況,並儘可能簡化客戶端代碼。

我知道我可以在客戶端DLL中創建一個預生成代理,它將包裝WCF調用並執行附加的序列化/反序列化。但我寧願能夠依賴從WSDL生成的客戶端。

理想情況下,RawAttribute可以放在參數或返回值上,以抑制序列化/反序列化(通用根object類型),而不是提供或期望一個(對象)byte [](或(object)Stream? )從操作。

[OperationBehavior] 
public void SaveMyData(long id, string name, [Raw] object serializableData){ ... } 

[OperationContract, Raw] 
object LoadMyData(long id, string name); 

我已經看了DataContractSurrogateDataContractResolver,但我沒有看到如何實現這一目標。 DataContractSurrogate在反序列化管道中似乎太晚了,因爲已經提供了類型和反序列化對象。解析器不提供數據,只是類型信息。它們都沒有提供關於參數被反序列化的信息,以便找到RawAttribute

WCF是否爲此提供了適當的可擴展性?還是內置的方式?

我也想知道從序列化數據中提取的聲明類型是什麼,但這不是必需的。

謝謝!

+0

Carlos已經寫了一系列WCF擴展點[這裏](http://blogs.msdn.com/b/carlosfigueira/archive/2011/03/14/wcf-extensibility.aspx),特別是圍繞序列化[這裏](http://blogs.msdn.com/b/carlosfigueira/archive/2011/08/30/wcf-extensibility-serialization.aspx) –

回答

0

而不是爭取WCF的序列化機制,你應該放棄一個抽象級別,並在WCF的消息級別工作。您所尋找的是一種「通用」服務,可以接受來自任何客戶端的消息。通讀這個舊的,但仍然適用MSDN article on WCF Messaging。接近文章的底部(圖8)是通用WCF服務的示例代碼。這應該至少讓您開始創建繞過序列化的服務。