从另一个服务下载ServiceStack WebApi文件(直通)

时间:2018-07-24 18:22:02

标签: c# asp.net-web-api2 servicestack

摘要:我有一个应用程序服务/ API和一个报告服务/ API;彼此互斥(在不同的服务器/环境上;应用服务无法访问报告服务文件系统)。我的前端应用程序调用应用程序服务以生成报告。应用服务将报告所需的BLL数据传递给报告服务,然后报告服务将构建报告并将其作为API发送回去。然后,应用程序服务需要传递该PDF文件,然后从浏览器下载该文件。

我遇到的麻烦是传递和获取应用程序服务以下载报告服务创建的文件。确认报告服务已成功构建报告。如果我直接致电报告服务,则会获得pdf下载。但是,当我通过应用程序服务打电话时,我的回答是一堆混乱的东西,而不是文件下载。

这两个服务都在WebAPI c#6上使用ServiceStack。

以下是响应文本的摘要:

%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);
}

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

2 个答案:

答案 0 :(得分:2)

在按照Mythz的建议查看Fiddler捕获并整理所有标头后,我意识到应用程序服务正在返回应用程序/八位字节流的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。

答案 1 :(得分:1)

text.txt也可以是流

var result = new HttpResult("text.txt", "application/pdf");
result.Headers.Add("Content-Disposition", "attachment;text.txt;");