WCF自定义数据类型作为OperationContract参数

WCF自定义数据类型作为OperationContract参数

问题描述:

我对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很陌生,如果这个问题没有任何意义,我先提前道歉;我会根据您的反馈进行更新。

您必须确保CustomDocument是一个Serializable对象并具有公共无参数构造函数。 最简单的方法是在WebService和将使用它的应用程序之间共享包含类CustomDocument的dll。 但是,当我尝试将复杂对象发送给WebServce时,我更愿意将其序列化为字节数组,然后在WebService内部反序列化。

祝你好运!

+0

谢谢;我会研究这个;不过,我有一种感觉,客户不会因为需要序列化而感到兴奋。在这种情况下,我会坚持使用多个params方法。再次感谢;我现在有一些阅读要做。 – 2015-02-23 19:00:39

您不需要自定义对象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