首页 > 解决方案 > 如何将 PDF 提交到 Microsoft .NET Web API

问题描述

我们在 Microsoft .NET Web API 中有一个 POST 方法。该 post 方法将 PDF 文件处理为 Sharepoint 站点。我们确实在 Postman 中测试过这个方法,并且这个方法相应地起作用

但是,我们正在尝试通过 PDF 本身上的提交按钮执行此方法,其操作 URL 特定于 Web Api 中的 Post 方法,与在邮递员中正常工作的 URL 完全相同

当我尝试执行该操作/单击提交按钮时,出现以下错误

在此处输入图像描述

有没有什么具体的策略可以直接通过PDF提交按钮执行Web Api POST方法

先感谢您

这是我的 Web Api Post 方法

[HttpPost]
        [Route("SubmitForm")]
        public async Task<IActionResult> SubmitForm()
        {

            var file = Request.Form.Files[0];
            HttpClient client = GetBinaryRequestClient();
            try
            {

                byte[] docAsBytes;
                using (var ms = new MemoryStream())
                {
                    file.CopyTo(ms);
                    docAsBytes = ms.ToArray();
                }

                PdfReader pdfReader = new PdfReader(docAsBytes);
                MemoryStream m = new MemoryStream();
                PdfStamper outStamper = new PdfStamper(pdfReader,m);
                string formName = outStamper.AcroFields.GetField("FormSeqNo");

                string endpointUrl = string.Format(
                   "{0}{1}/_api/web/GetFolderByServerRelativeUrl('{2}')/Files/Add(url='{3}', overwrite=true)",
                   this.apiService.AppSettings.SharePointSettings.SPSiteURL,
                   this.apiService.AppSettings.SharePointSettings.SmartFormsRelativeSiteURL,
                   this.apiService.AppSettings.SharePointSettings.SubmittedPDFsLibrary,
                   $"{formName}.pdf");

                ByteArrayContent imageBytes = new ByteArrayContent(docAsBytes);
                var result = await client.PostAsync(endpointUrl, imageBytes);

                return Ok(); 
            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, $"Error in method {ex.Message}");
            }


        }

标签: c#pdfasp.net-core-webapi

解决方案


这是对我有用的答案。.NET API 方法必须正确接收基于 PDF 的请求并使用 DFD 类型写回响应,而不是返回它

[HttpPost]
[Route("SubmitForm")]
public async Task SubmitForm()
{

    var file = Request.Body;
    HttpClient client = GetBinaryRequestClient();
    try
    {

        byte[] docAsBytes;
        using (var ms = new MemoryStream())
        {
            file.CopyTo(ms);
            docAsBytes = ms.ToArray();
        }

        PdfReader pdfReader = new PdfReader(docAsBytes);
        MemoryStream m = new MemoryStream();
        PdfStamper outStamper = new PdfStamper(pdfReader,m);
        string formName = outStamper.AcroFields.GetField("FormSeqNo");

        string endpointUrl = string.Format(
           "{0}{1}/_api/web/GetFolderByServerRelativeUrl('{2}')/Files/Add(url='{3}', overwrite=true)",
           this.apiService.AppSettings.SharePointSettings.SPSiteURL,
           this.apiService.AppSettings.SharePointSettings.SmartFormsRelativeSiteURL,
           this.apiService.AppSettings.SharePointSettings.SubmittedPDFsLibrary,
           $"{formName}.pdf");

        ByteArrayContent imageBytes = new ByteArrayContent(docAsBytes);
        var result = await client.PostAsync(endpointUrl, imageBytes);
       Response.Redirect(this.apiService.AppSettings.SharePointSettings.SPSiteURL);

        //return Ok(); 
    }
    catch (Exception ex)
    {
        //return null;// StatusCode(StatusCodes.Status500InternalServerError, $"Error in method {ex.Message}");
        await ReturnFDFResponse("Error Occured " + ex.Message);
    }
}


private async Task ReturnFDFResponse(string status)
{
    string fdfmessage = "%FDF-1.2" + "\n" + "1 0 obj <<" + "\n" + "/FDF <<" +
        "\n" + "/Status (" + status + "!)" + "\n" + ">>" + "\n" +
        ">>" + "\n" + "endobj" + "\n" + "trailer" + "\n" + "<</Root 1 0 R>>" +
        "\n" + "%%EOF";

    HttpResponseMessage fdfresult = new HttpResponseMessage(HttpStatusCode.OK);
    MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(fdfmessage));
    stream.Position = 0;
    fdfresult.Content = new StreamContent(stream);
    fdfresult.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.fdf");
    Response.ContentType = "application/vnd.fdf";
    await Response.Body.WriteAsync(stream.ToArray());
}

推荐阅读