首页 > 解决方案 > 从另一个服务下载 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);
}

我尝试了各种各样的流、字节读取等。我已经像许多搜索结果示例一样设置了我的代码,但我还没有找到在两个不同服务之间传递文件的示例。我确定我在服务之间的传递中遗漏了一些东西,但我不确定。

标签: c#asp.net-web-api2servicestack

解决方案


在按照 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。


推荐阅读