我对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很新,如果这个问题没有任何意义,我提前道歉;我会根据您的反馈更新它。
答案 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中托管)。