2015-02-23 88 views
0

我對WCF很新,有一個問題,我希望你能幫助我。WCF自定義數據類型作爲OperationContract參數

項目:我被要求創建一個WCF服務,允許客戶端能夠上傳一個word文件以及一些元數據。

客戶端沒有POST調用他們將做,所以我不能創建一個類關閉該WSDL的樣本,但後期將包含的數據是這樣的:

{ 
    author: 'John Doe', 
    pages: '32', 
    size: '14432', 
    authToken: '322222222233', 
    encoding: 'binary' 
    name: 'Document1.doc' 
} 

我正在考慮創建一個[OperationContract],例如bool UploadFile(CustomDocument inputDocument),而不是bool UploadFile(字符串作者,字符串編碼....)。

我的問題:如果我使用自定義對象作爲一個[OperationContract的]輸入參數(CustomDocument)將客戶端能夠通過所有的信息串,在其服務調用int等,或他們是否必須首先在其最後創建一個CustomDocument實例,然後在該文章中包含該對象?

對不起,我對WCF很陌生,如果這個問題沒有任何意義,我先提前道歉;我會根據您的反饋進行更新。

回答

0

您必須確保CustomDocument是一個Serializable對象並具有公共無參數構造函數。 最簡單的方法是在WebService和將使用它的應用程序之間共享包含類CustomDocument的dll。 但是,當我嘗試將複雜對象發送給WebServce時,我更願意將其序列化爲字節數組,然後在WebService內部反序列化。

祝你好運!

+0

謝謝;我會研究這個;不過,我有一種感覺,客戶不會因爲需要序列化而感到興奮。在這種情況下,我會堅持使用多個params方法。再次感謝;我現在有一些閱讀要做。 – 2015-02-23 19:00:39

0

您不需要自定義對象CustomDocument。假設你有這樣的服務

[ServiceContract] 
public interface IMyTestServce 
{ 
    [OperationContract] 
    [WebInvoke(Method = "POST", 
     BodyStyle = WebMessageBodyStyle.Wrapped, 
     UriTemplate = "/Upload?author={author}&pages={pages}&size={size}&name={name}&authToken={authToken}")] 
    void Upload(string author, int pages, long size, string name, 
       string authToken, 
       Stream file); 
} 

public class MyTestService : IMyTestServce 
{ 
    public void Upload(string author, int pages, long size, string name, 
         string authToken, 
         Stream file) 
    { 
     Console.WriteLine(String.Format("author={0}&pages={1}&size={2}&name={3}&authToken={4}", author, pages, size, name, authToken)); 
     Console.WriteLine(new StreamReader(file).ReadToEnd()); 
    } 
} 

您可以輕鬆地調用它

HttpClient client = new HttpClient(); 
var content = new StreamContent(File.OpenRead(filename); 
await client.PostAsync("http://localhost:8088/Upload?author=aa&pages=3&name=bb&authToken=112233", content); 

PS:您需要使用的WebHttpBinding(或WebServiceHost如果不是在IIS託管)。

+0

感謝您以實例詳細回覆;我真的很感激它,並發現它非常有用。我會用你的方法來解決我的問題。 – 2015-02-23 19:02:22

+0

快速愚蠢的問題。在你給的public void()例子中,我可以實際指定int,long等作爲類型,還是它們都必須是字符串?我只是想知道,如果我應該只是在方法中指定param數據類型,或者只是接收所有的字符串(文件流除外),然後解析/驗證,以確保它符合要求。 – 2015-02-23 19:23:44

+0

@SelfPreservation在發佈之前,我測試了以上代碼。有用。說,使用int,long或string,它取決於你。使用任何你喜歡的。一切都會奏效。 – EZI 2015-02-23 19:26:56