如何在ActionResult Asp.net Mvc C#

问题描述

一个名为 GetFile方法被写入一个返回 WebApiHttpResponseMessage 项目:

WebApi 控制器 I am using NReco.PdfGenerated library

    [HttpGet]
    [Route("GetFile")]
    [NoCache]
    public HttpResponseMessage GetFile()
    {
            try
            {
                var httpRequest = HttpContext.Current.Request;

                var html = HttpUtility.UrlDecode(httpRequest.Headers["_GetFile"] ?? "");
    
                if (string.IsNullOrWhiteSpace(html))
                {
                    return null;
                }
                var response = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new StreamContent(new MemoryStream(new HtmlToPdfConverter().GeneratePdf(html)))
                };
                response.Content.Headers.ContentType =
                    new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf");

                return response;
            }
            catch
            {
            }
            return null;
    }

在另一个项目中,我想通过 GetFile 连接到 ActionResult 方法获取文件。 ActionResult 的写法如下:

请求类:

public class GeneratedHtmlToPdfRequest
{
    [AllowHtml]
    public string Html { get; set; }
}

控制器(Asp.net Mvc):

[HttpPost]
public ActionResult GeneratedHtmlToPdf(GeneratedHtmlToPdfRequest request)
{
        var userData = CookieController.GetUserDataCookie(CookieController.SGP_PORTAL_ALL_USER);

        string encodeText = HttpUtility.UrlEncode(request.Html);

        var response = var response = WebController.CallApiWithHeader(
            "http://baseUrlWebApi.com","GetFile","_GetFile",encodeText).Result; //call web api method

        var result = response.ReadAsByteArrayAsync().Result;
        TempData[WebVariables.TEMP_DATA_FILE] = result;

        return Json(new PostGeneratedHtmlToPdf()
        {
            RedirectUrl = WebController.GetCurrentWebsiteRoot() + "***/***/FileDownload/" + DateTime.Now.ToString("yyyyMMddHHmmss")
        });
}

[HttpGet]
public virtual ActionResult FileDownload(string id)
{
     var tempByte = (byte[]) TempData[WebVariables.TEMP_DATA_FILE];
     TempData[WebVariables.TEMP_DATA_FILE] = tempByte;
     return File(tempByte,"application/pdf",id);
}

函数调用 web api)

public static async Task<HttpContent> CallApiWithHeader(string url,string methodName,string headerName = "",string header = "")
{
        try
        {
            HttpClient client = new HttpClient {BaseAddress = new Uri(url)};
            client.DefaultRequestHeaders.Add(headerName,header);

            return client.GetAsync(methodName).Result.Content;
        }
        catch (Exception ex)
        {
            return null;
        }
}

jquery 被编写为调用 GeneratedHtmlToPdf 方法

            window.$('body').on('click','#bDownload',function(event) {
                event.preventDefault();

                var html = window.$('#layoutLegalBill').html();

                window.$('#layoutLegalBill').html(ShowLayoutLoading());

                const formData = new FormData();
                formData.append('request.Html',html);

                var xmlHttpRequest = new XMLHttpRequest();
                if (!window.XMLHttpRequest) {
                    xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
                }

                xmlHttpRequest.open(
                    "POST",'@Url.Action("GeneratedHtmlToPdf","***",new {area = "***"})',true);

                xmlHttpRequest.onerror = function() {
                    ShowAlert(ErrorText(),'dark',true);
                };

                xmlHttpRequest.onloadend = function() {
                    window.$('#layoutLegalBill').html(html);
                    var response = ParseJson(xmlHttpRequest.responseText);
                    
                    window.location = response.RedirectUrl;
                }
                xmlHttpRequest.send(formData);
            });

问题是文件下载了但打不开,报错。

文件大小为 17kb)

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)