WCF return MemoryStream returns 空白和状态 202
WCF return MemoryStream returns blank and status 202
我的 WCF 服务正在代理另一个网络服务。每当我修改响应和 return 内存流时,客户端都会收到 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();
您需要设置 OutgoingResponse.ContentType
并在返回响应之前添加 Content-Disposition
header 如下:
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;
}
终于解决了。由于我的服务是代理,因此我将收到的 headers 传递给客户端而不修改它们。在返回流之前删除内容编码 header 对我有用
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;
}
我的 WCF 服务正在代理另一个网络服务。每当我修改响应和 return 内存流时,客户端都会收到 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();
您需要设置 OutgoingResponse.ContentType
并在返回响应之前添加 Content-Disposition
header 如下:
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;
}
终于解决了。由于我的服务是代理,因此我将收到的 headers 传递给客户端而不修改它们。在返回流之前删除内容编码 header 对我有用
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;
}