c# - 从另一个服务下载 ServiceStack WebApi 文件(传递)
问题描述
总结:我有一个应用服务/API和一个报告服务/API;相互排斥(在不同的服务器/环境上;应用服务无权访问报告服务文件系统)。我的前端应用程序调用应用程序服务来构建报告。应用服务将报告所需的 BLL 数据传递给报告服务,报告服务然后构建报告并将其作为 API 发送回。然后,应用服务需要传递该 PDF 文件并从浏览器下载。
我遇到的麻烦是传递并让应用服务下载报告服务创建的文件。确认报告服务已成功构建报告。如果我直接调用报告服务,我会下载 pdf 文件。但是,当我通过应用程序服务调用时,我的响应是一堆乱七八糟的东西,而不是文件下载。
两种服务都使用 WebAPI 上的 ServiceStack,c# 6。
以下是响应文本的片段:
%PDF-1.2
%âãÏÓ
1 0 obj
<<
/Type /Catalog
/Pages 2 0 R
/PageMode /UseNone
/ViewerPreferences <<
/FitWindow true
/PageLayout /SinglePage
/NonFullScreenPageMode /UseNone
>>
>>
endobj
5 0 obj
<<
/Length 5964
/Filter [ /FlateDecode ]
>>
stream
xµ]ÛrÜF}çWTļ4#D³î½IdÆthDywg DBT¯ÝÝÔüÇ~ðÃÄüÀf]d±q)zl;,<@¢pêdVV¢X¢ßPE(ü{Bãq\ÞÑðÃíu:xóí2øÿ£Ö&oë£ÿ>j8yuÄ)ùÇr0-%aÔYJ¤Vþp/ù;E¥ñçp5ß]iΦ<ܸþGÆ
oÑHr¹plü¦µâIxBIJ¾!.`áÄ7;ÚJx <9u2 VPÖ!áw÷8&ûfãþQN
ÖÂ1§:Z3\¾éáZ)bû¨Pý]ñ¤oDOÕÍQd»kCâÞéøNÚ¥³£cálÀdÉcÆæ,ÂI((ppXpÒ#####
0y0Y09Ð9Ð9PÎ '=¢1¢1"0"0B1B"
BÂIHH00pÒ#
#
##!sÀ1sÀ1sÀ;7
|O÷ÇSAeç.áAàt=äHË:(#/ó²ìüÏßÔÂii10jrcLbÌ9±Òäl¨¡á±f@@ÈÑÂ"0b6# LFA,H0q 34â@g(Cûø)"¢3!D`DZÐQ"MpHÀ6 ,Cô!!*C(B8F8âgpÄÏ8àÞq`¹
ÂÑë&º-ƨÉ111ç0Ä2H³"¢2"cĸ!!#1a3"âÁd4ÄÉHÐq :ã@#tÆ2!LÆcgB$Bt0H!j@¤ÉáÂ2D°"¢2"c#xÆGð8à1íK?ô?a
a}ÄO§cc)â'e >âÇ3!!#)âÇc!!:CBFbÂfDÄÉh0 &ã@#tÆFèñãqíâDÎñ#B3D
我认为我不需要发布太多关于报告服务的信息,因为这似乎不是问题。不过,这是那边的帖子:
[AddHeader(ContentType = "application/pdf")]
public object Post(ClaimInformationFormRequest request)
{
var report = new ClaimInformationForm(request);
return report.GetReport();
}
在应用服务方面,情况并没有太大的不同:
[AddHeader(ContentType = "application/pdf")]
public object Any(ClaimInformationFormReportRequest req)
{
//Omitted from this sample... it's BLL that creates the 'messageData' and other params/vars; works fine
var res = new { SponsorId = paramSponsorId, ClaimMonth = paramMonth, ClaimYear = paramYear, Data = messageData };
var client2 = ServiceClientFactory.GetJsonClient(ExternalServicesHelper.GetReportsUrl());
client2.UseBasicAuth(UserSessionState.GetBasicAuthHeader());
return client2.Post<byte[]>("/homes/ClaimProcessing/ClaimInformationForm", res);
}
我尝试了各种各样的流、字节读取等。我已经像许多搜索结果示例一样设置了我的代码,但我还没有找到在两个不同服务之间传递文件的示例。我确定我在服务之间的传递中遗漏了一些东西,但我不确定。
解决方案
在按照 Mythz 的建议查看 Fiddler 捕获并将标头全部排好之后,我意识到应用程序服务正在返回 application/octet-stream 的 Content-Type。解决方案是改变我从应用程序服务返回信息的方式。
改变了这个:
return client2.Post<byte[]>("/homes/ClaimProcessing/ClaimInformationForm", res);
对此:
var result = client2.Post<byte[]>("/homes/ClaimProcessing/ClaimInformationForm", res);
return new HttpResult(result, "application/pdf");
然后我收到了文件保存对话框和随后的 PDF。
推荐阅读
- python - 根据列列表 Pandas 将浮点列转换为 int
- c# - 获取字符串 Html 敏捷包
- python - 运行“numpy.f2py.compile()”时出现“IOError: [Errno 13] Permission denied”
- excel - 如何在工作簿关闭时使用 VBA 删除条件格式
- python - Jupyter notebook 在浏览器上显示空白主页
- java - Gradle groovy 语法“配置 {all*.exclude ...}”
- reactjs - 使用 AsyncStorage 保存价值的麻烦
- python - 从python中的类继承__init__
- c# - 简化 C# 中的多个(非嵌套)foreach 循环
- android - 如何存储临时值?