使用POST在两个独立服务器上的控制器方法之间进行通信

时间:2016-04-05 16:14:04

标签: c# asp.net-mvc post

我正在使用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控制器方法发送数据。我在这里写的代码是基于我发现的如何完成的例子。

关于我做错了什么的想法?

1 个答案:

答案 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解串器。