首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >streamReader.ReadToEndAsync()更改消息内容

streamReader.ReadToEndAsync()更改消息内容
EN

Stack Overflow用户
提问于 2020-08-04 14:51:12
回答 1查看 508关注 0票数 2

我有一个WCFCore3.1WebAPI,它需要与外部服务交互,该外部服务提供来自.Net服务的多部分/相关响应,并在上下文中提供附件,如下所示。

代码语言:javascript
复制
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 1790633
Content-Type: multipart/related; type="text/xml"; start="<8fb5b3efa6474add9032cb80870dc065>"; boundary="------=_Part_20200731120159.494997"
Server: Microsoft-IIS/10.0
Set-Cookie: ASP.NET_SessionId=jga2opbhoirgnhjhmmsuxi1k; path=/; HttpOnly; SameSite=Lax
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=f7b4f7f5d8cbd8c8bc5d9a4bf49e8b5938412c4294f6e2c2b5c2d5cfc4b4d437;Path=/;HttpOnly;Domain=lparouterpoc.azurewebsites.net
Date: Fri, 31 Jul 2020 13:33:04 GMT


--------=_Part_20200731120159.494997
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: binary
Content-Id: <8fb5b3efa6474add9032cb80870dc065>

<?xml version="1.0" encoding="iso-8859-1"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
...
</SOAP-ENV:Envelope>
--------=_Part_20200731120159.494997
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
Content-Id: 7b1fff220df5@xxxxx

%PDF-1.5
%����
...
Additional characters added in here
...
%%EOF

--------=_Part_20200731120159.494997
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
Content-Id: 844eb478dc05@xxxxx

%PDF-1.5
...
Additional characters added here
...
%%EOF
--------=_Part_20200731120159.494997--

使用SOAP,我看到有附件,但每个附件都是一个空白PDF。

.Net核心应用编程接口中的代码是

代码语言:javascript
复制
using (var response = await Client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
{
    var stream = await response.Content.ReadAsStreamAsync();
    using var streamReader = new StreamReader(stream, Encoding.UTF8);
    var message = await streamReader.ReadToEndAsync(); // This is where output is changed to add additional characters
    var headers = response.Headers;
    return new customResponse
    {
        ContentResult = new ContentResult
        {
            Content = message,
            ContentType = response.Content.Headers.ContentType?.ToString(),
            StatusCode = (int)response.StatusCode
        },
        ResponseHeaders = headers
    };
}

下图显示了导致PDF无效\损坏\空白的额外字符的示例。

它的另一个特征是内容长度从1021690到1790633。

我已经能够调试到这一步,并在文件进入消息(字符串)之前测试它们是正确的,因为我能够读取多部分内容并将文件写出到磁盘,当使用

代码语言:javascript
复制
var content = await response.Content.ReadAsMultipartAsync();
for (var i = 0; i < content.Contents.Count; i++)
{
    var item = content.Contents[i];
    if (item.Headers.ContentType.ToString() == "application/octet-stream")
    {
        var bytes = await item.ReadAsByteArrayAsync();
        File.WriteAllBytes(@$"c:\temp\{i}.pdf", bytes);
    }

}

然后遍历content.Contents

如果有人能告诉我为什么会发生这种情况,以及如何阻止这种情况发生,我将不胜感激。

进一步的调查和假设是,这是否可以归因于编码?附件的WCF服务是TransferEncoding = "binary“

图像的左边和中间是一样的,中间直接从我的API (不是我需要的)写到磁盘,这表明文件是可以读写的。

右边是服务的直接输出,如预期的那样返回到SOAP UI和下载中。

在查看监视窗口中的响应时,传输编码为空,因此我对如何解决此问题感到有点困惑。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-04 21:06:01

尝尝这个,

代码语言:javascript
复制
public async Task<HttpResponseMessage> Post(string requestBody, string action)
{
    using (var request = new HttpRequestMessage(HttpMethod.Post, ""))
    {
        request.Headers.Add("SOAPAction", action);
        request.Content = new StringContent(requestBody, Encoding.UTF8, "text/xml");
        var response = await Client.SendAsync(request);
        return response;
    }
}

然后在你的控制器中像这样返回它

代码语言:javascript
复制
var result = await _service.Post(requestBody, action);

var stream = await result.Content.ReadAsStreamAsync();
await stream.CopyToAsync(HttpContext.Response.Body);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63241571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档