如何从WCF服务返回流?

kat*_*tit 5 .net wcf stream protobuf-net

我正在玩protobuf-net和WCF.这是我创建的代码:

public class MobileServiceV2
{
    [WebGet(UriTemplate = "/some-data")]
    [Description("returns test data")]
    public Stream GetSomeData()
    {
        WebOperationContext.Current.OutgoingResponse.ContentType = "application/x-protobuf";

        var ms = new MemoryStream();
        ProtoBuf.Serializer.Serialize(ms, new MyResponse { SomeData = "Test data here" });
        return ms;
    }
}

[DataContract]
public class MyResponse
{
    [DataMember(Order = 1)] 
    public string SomeData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我看到Fiddler时 - 我可以看到正确的传出内容类型,并且看起来都很好,但我得到了空洞的回应.IE提示下载文件,此文件为空.序列化器无法正常工作吗?或者我只是不做对吗?

编辑:

我在方法中添加了以下代码,是的,它正确序列化.我如何从WCF返回流有什么问题..

using (var file = File.Create("C:\\test.bin"))
        {
            Serializer.Serialize(file, new MyResponse { SomeData = "Test data here" });
        }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 10

只需写入MemoryStream,然后回退即可.不要 Dispose()方法是在这种情况下:

var ms = new MemoryStream();
Serializer.Serialize(ms, obj);
ms.Position = 0;
return ms;
Run Code Online (Sandbox Code Playgroud)

但是,这确实意味着它在内存中缓冲.我可以试着想出一些伏都教来避免这种情况,但这会非常复杂.

  • 那么,用“using”语句包装它是否会导致它在“Stream”传输之前进行处理?我收到“底层连接已关闭:连接意外关闭”异常。 (2认同)