c# - 如何将 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}");
}
}
解决方案
这是对我有用的答案。.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());
}
推荐阅读
- c++ - USACO 分级机的响应与我的机器不同
- python-3.x - Keras 错误 - 预期 block5_pool 有 4 个维度,但得到了形状为 (6, 1) 的数组?
- javascript - 如何使缩放图像不经过其容器
- javascript - Kendo UI 下拉列表已选中
- java - 使用 2d 数组和 for 循环的 Mailman 邮箱问题
- java - Spring Data Rest JPA rest service with hibernate:控制延迟加载
- javascript - 如何从 javascript 函数内部调用 jquery buttonclick 函数
- ant - 带有空输入字符串的 apache Ant 基本名称问题
- asp.net-mvc - Azure 应用服务上的瞬态无限登录循环 - 使用 Azure AD 进行 OpenIDConnect 身份验证
- php - 如何从字符串中添加数字