如何从C#中的Response.OutputStream中读取

时间:2016-03-08 14:25:57

标签: c# .net servicestack bytearray outputstream

我使用ServiceStack创建服务。在其中一种方法中,我在响应的输出流中写了一些数据,如:await response.OutputStream.WriteAsync(Consts.DATA, 0, Consts.DATA.Length);,其中数据是byte[]。好的,现在问题是当从客户端使用此服务并获取指定方法的HttpResponseMessage时,我不知道如何获取数据。我不打算单元测试实际响应是否包含我在写入输出内容时传递的数据。

(我已尝试过ReadAsByteArray,但它会引发异常。当读取Stream或String时,我不知道如何使它成为一个字节[],以便在测试中将其与受影响的Consts进行比较。 DATA字节数组。)

我对这个领域很陌生,如果我错过了什么,请原谅我的无知。任何帮助表示赞赏。 谢谢!

4 个答案:

答案 0 :(得分:1)

如果您想使用键入的客户端,您可以(来自documentation):

作为原始字节:

byte[] responseBytes = client.Get<byte[]>("/poco/World");
var dto = responseBytes.FromUtf8Bytes().FromJson<PocoResponse>();
dto.Result //Hello, World

或者作为一个流:

using (Stream responseStream = client.Get<Stream>("/poco/World")) {
    var dto = responseStream.ReadFully()
        .FromUtf8Bytes()
        .FromJson<PocoResponse>();
    dto.Result //Hello, World
}

甚至可以访问填充的HttpWebResponse对象:

HttpWebResponse webResponse = client.Get<HttpWebResponse>("/poco/World");

webResponse.Headers["X-Response"] //World
using (var stream = webResponse.GetResponseStream())
using (var sr = new StreamReader(stream)) {
    var dto = sr.ReadToEnd().FromJson<PocoResponse>();
    dto.Result //Hello, World
}

您也可以使用无类型ServiceStack客户端来访问原始响应,documentation with samples中对此进行了描述。

答案 1 :(得分:0)

通过以下静态方法运行输出流:

    public static byte[] ReadFullStream(Stream st)
    {
        var lockTaken = false;
        try
        {
            Monitor.Enter(_lock, ref lockTaken);
            var size = 0;
            var continueRead = true;
            var buffer = (byte[])Array.CreateInstance(typeof(byte), 0x10000);
            using (MemoryStream ms = new MemoryStream())
            {
                while (continueRead)
                {
                    size = st.Read(buffer, 0, buffer.Length);
                    if (size > 0)
                    {
                        ms.Write(buffer, 0, size);
                    }
                    else
                    {
                        continueRead = false;
                    }
                }
                return ms.ToArray();
            }
        }
        finally
        {
            if (lockTaken) { Monitor.Exit(_lock); }
        }
    }
编辑:忘了,你需要在课堂范围内定义:

    private static readonly object _lock = new object();

答案 2 :(得分:0)

如果您只需要将URL中的数据作为Stream加载,并且您使用的是HttpClient,则可以执行此操作以获取流:

var result = await client.GetStreamAsync(URL);

我认为您也可以在HttpWebResponse上使用GetResponseStream()。

 var result = message.GetResponseStream();

答案 3 :(得分:0)

阅读响应流如下 -

      using (var reader = new System.IO.StreamReader(response.GetResponseStream()))
                {
                    responseContent = reader.ReadToEnd();

                    if (response.StatusCode == HttpStatusCode.OK && response.StatusDescription.ToUpper() == "OK" && !string.IsNullOrEmpty(responseContent))
                    {
                        objFSLstGetAgent = JsonConvert.DeserializeObject<YourObjectClass>(responseContent);
                    }
                }