2016-02-22 25 views
0

我創建使用WCF的服務器,並且在這個例子中創建我使用的功能屬性不同的端點不會忽略,如:如何爲屬性和變量構造函數使用相同的數據?

[OperationContract] 
[FaultContract(typeof(ErrorClass))] 
[WebInvoke(Method = "POST", UriTemplate = "/endpoint/adress", ResponseFormat = WebMessageFormat.Json)] 
public async Task<Stream> EndpointFunction(Stream someContent) 
{ 
    magic 
} 

然後,在客戶端庫,我們定義了相同的數據這樣的url可以動態構建,如下所示:

public const string ServerSettings = "/endpoint/adress/"; 

我真的很喜歡在這兩個地方不要硬編碼端點地址。在C++中,我會定義一個宏#ENDPOINTADRESS「/ endpoint/Adress」並在兩個地方使用它,但是宏在C#中不存在。有什麼辦法可以避免這種代碼重複?

+0

配置文件???? – Viru

+0

@Viru由於屬性的值被編譯到程序集中,所以不是一個選項,因此在運行時不能「設置」。 – Maarten

回答

0

不幸的是屬性和它們的值,被編譯成彙編。因此無法在運行時設置它們的值。

但是,如果從客戶端側,可以參考在其中定義可以使用反射在客戶端,以檢索的屬性值的服務器類的組件。事情是這樣的:

// TODO: Add all kinds of safety checks 
var mi = typeof(ServerImplementationClass).GetMethod("EndpointFunction"); 
var atts = mi.GetCustomAttributes(false); 
var wi = atts.OfType<WebInvokeAttribute>().FirstOrDefault(); 
var uri = wi.UriTemplate; // Yields: "/endpoint/adress" 
+0

這非常酷,但是這將需要客戶端項目包含服務器端的接口甚至實現類,這是我更喜歡的共享。此外,反射可能有點貴,特別是在Android/iOS上運行的Unity3D,這是我們的客戶做的......如果我找不到另一種方式,我可能會使用此解決方案,再次感謝:) – Cousken

+0

反射會在啓動時只需要做一次。並且...您可以使用鏈接文件和部分類的一些小技巧,以防止實際實現泄漏到客戶端項目。 – Maarten

+0

感謝您瀏覽幫助@maarten。你有什麼樣的安全檢查? – Cousken

相關問題