刚开始学习wcf,遇到一个问题,就是如果我想在服务器端定义一个有两个参数的方法,一个参数为Stream,另一个为string或其它类型,访问WCF时就会报出这个错误:
[InvalidOperationException: 要使操作 GetName 中的请求成为流,操作必须具有其类型为 Stream 的单个参数。]
这个是我服务器端接口的写法:
- C# code
[ServiceContract] public interface ITestService { [OperationContract] [WebInvoke(Method = "POST")] Stream GetName(Stream name,string inputStr); }
这个是我服务器端实现的方法
- C# code
public class TestService:ITestService { public TestService() { // // TODO: Add constructor logic here // } public Stream GetName(Stream name,string inputStr) { var sr = new StreamReader(name); string text = sr.ReadToEnd(); return new System.IO.MemoryStream(Encoding.UTF8.GetBytes("Test Service: "+" inputStr: "+inputStr+ text)); } }
运行就会有上面的错误
大神们,我要写一个及接收Stream,又同时接收其它类型的方法用该怎么设置?
我第一次玩csdn,有好多不懂得东西,谢谢各位了
------解决方案--------------------
用MessageContract修饰的类作为参数。Stream声明在类里面。
- C# code
[ServiceContract] public interface ITransferService { [OperationContract] RemoteFileInfo DownloadFile(DownloadRequest request); [OperationContract] void UploadFile(RemoteFileInfo request); } [MessageContract] public class DownloadRequest { [MessageBodyMember] public string FileName; } [MessageContract] public class RemoteFileInfo : IDisposable { [MessageHeader(MustUnderstand = true)] public string FileName; [MessageHeader(MustUnderstand = true)] public long Length; [MessageBodyMember(Order = 1)] public System.IO.Stream FileByteStream; public void Dispose() { if (FileByteStream != null) { FileByteStream.Close(); FileByteStream = null; } } }