我正在使用C#6.0,ASP.NET 4.5 MVC 4。
我正在开发一个API,它本质上是另一个生成PDF的API的包装器。单独的服务器将直接实现它,所有其他应用程序将其数据发送到此服务器进行转换。基础PDF转换软件具有特定的系统要求,因此这将使我们免于限制我们的应用程序可以运行的机器。它也有点脆,所以隔离它是可取的。
为了实现这一目标,我设置了两个独立的MVC应用程序,一个是转换实现,另一个是生成要转换的数据的简单应用程序,它实现了我正在开发的API。它们被设置为使用POST交换数据。
我遇到的问题是PDF服务器没有接收要转换的数据。它运行,但其参数仅包含null。我进行了设置,以便在发生这种情况时返回包含错误的PDF。它成功完成,包含它生成的结果错误消息,以便它的一部分正常运行。
以下是PDF服务器上运行的代码:
[HttpPost]
public FileResult MakePdf(string html)
{
byte[] pdf = null;
var converter = new HtmlToPdfConverter();
try
{
pdf = converter.GeneratePdf(html);
}
catch (Exception e)
{
Debug.WriteLine(e.Message);
var errorHtml = errorTop + new Regex("\\s").Replace(e.Message, " ") + errorBottom;
pdf = converter.GeneratePdf(errorHtml);
}
return File(pdf, "application/pdf");
}
以下是将HTML转发到那里的代码:
public byte[] Fetch() {
var webRequest = (HttpWebRequest)WebRequest.Create("http://localhost:60272/PdfServer/MakePdf");
webRequest.Method = "POST";
var encoder = new UTF8Encoding();
byte[] data = encoder.GetBytes(Resource); // Resource contains valid HTML output by ASP.NET
webRequest.ContentLength = data.Length;
webRequest.ContentType = "text/html";
using (var stream = webRequest.GetRequestStream())
{
stream.Write(data, 0, data.Length);
stream.Flush();
}
using (var webResponse = webRequest.GetResponse())
{
using (Stream responseStream = webResponse.GetResponseStream())
{
using (var memoryStream = new MemoryStream())
{
int bufferLength = 1024;
data = new byte[bufferLength];
int responseLength = 0;
do
{
responseLength = responseStream.Read(data, 0, bufferLength);
memoryStream.Write(data, 0, responseLength);
} while (responseLength != 0);
data = memoryStream.ToArray();
}
}
}
return data;
}
我之前没有尝试从单独的应用程序向ASP.NET MVC控制器方法发送数据。我在这里写的代码是基于我发现的如何完成的例子。
关于我做错了什么的想法?
答案 0 :(得分:1)
尝试对其进行编码:" application / x-www-form-urlencoded"并命名字符串数据html。所以它看起来像:
var s = "html=" + Resource;
然后发送s,而不是发送资源。当然,将内容类型设置为"application/x-www-form-urlencoded"
。这应该有助于MVC将数据映射到html参数。
这是我唯一能想到的。
另一方面,我认为您完成后也应该Close()
您的信息流,而不是将其刷新。
===
最后一个想法是尝试将您的编码从text / html更改为text / plain。我知道你正在考虑它的HTML,但是你的方法是一个字符串。所以对于MVC来说,它期望一个字符串,而不是HTML,事实上它实际上是HTML附带于MVC解串器。