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

时间:2015-02-23 17:56:27

标签: c# wcf

我对WCF很新,并且有一个问题,希望你能帮助我。

项目:我被要求创建一个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很新,如果这个问题没有任何意义,我提前道歉;我会根据您的反馈更新它。

2 个答案:

答案 0 :(得分:0)

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

祝你好运!

答案 1 :(得分: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中托管)。