WCF return MemoryStream возвращает пустое состояние 202 - PullRequest
0 голосов
/ 05 марта 2020

Мой WCF-сервис прокси-сервер другого веб-сервиса. Всякий раз, когда я изменяю ответ и возвращаю поток памяти, клиент получает 202-Accepted.

public Stream MyMethod()
    {
        ...
        ...

        HttpWebResponse httpGetResponse = (HttpWebResponse)httpGetRequest.GetResponse();
        var result = httpGetResponse.GetResponseStream();

        //if I return "result" here, I get a 200 and Messagebody contains the contents of the stream
        //return result;

        //modifying content body
        var txtresult = new StreamReader(result, Encoding.UTF8).ReadToEnd();
        txtresult = txtresult.Replace("old text", "new text");

        var stream = new MemoryStream();
        stream.Write(Encoding.UTF8.GetBytes(txtresult), 0, Encoding.UTF8.GetBytes(txtresult).Length);
        //same as:- new MemoryStream(Encoding.UTF8.GetBytes(txtresult));

        stream.Position = 0L;
        //stream.Flush();

        //returns 202 - Accepted. Content body is empty
        return stream;
    }

По сути, мне просто нужно изменить содержимое потока, прежде чем пересылать их клиентскому приложению. Я проверил, что кодировка правильная. Помимо этого я не уверен, что я делаю неправильно. Пожалуйста, помогите

Кроме того, определение интерфейса выглядит следующим образом:

    [WebInvoke(Method = "GET",
             BodyStyle = WebMessageBodyStyle.Bare,
             UriTemplate = "teststream")]
    Stream MyMethod();

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Мне наконец удалось это решить. Поскольку мой сервис - прокси, я передавал полученные заголовки клиенту, не изменяя их также. Удаление заголовка Content Encoding перед возвратом потока работало для меня

   public Stream MyMethod()
{
    ...

    HttpWebResponse httpGetResponse = (HttpWebResponse)httpGetRequest.GetResponse();
    var result = httpGetResponse.GetResponseStream();

    var txtresult = new StreamReader(result, Encoding.UTF8).ReadToEnd();
    txtresult = txtresult.Replace("old text", "new text");

    var stream = new MemoryStream();
    stream.Write(Encoding.UTF8.GetBytes(txtresult), 0, Encoding.UTF8.GetBytes(txtresult).Length);

    stream.Position = 0L;
//added this line 
WebOperationContext.Current.OutgoingResponse.Headers.Remove(HttpRequestHeader.ContentEncoding);


    //now returns actual content to client
    return stream;
}
0 голосов
/ 05 марта 2020

Вам необходимо установить OutgoingResponse.ContentType и добавить заголовок Content-Disposition, прежде чем возвращать ответ следующим образом:

public Stream MyMethod()
{
    ...

    var stream = new MemoryStream();
    stream.Write(Encoding.UTF8.GetBytes(txtresult), 0, Encoding.UTF8.GetBytes(txtresult).Length);

    stream.Position = 0L;

    WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain";
    WebOperationContext.Current.OutgoingResponse.Headers.Add("Content-disposition", "inline; filename=result.txt");

    return stream;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...