将文件下载到 Azure 函数应用进行操作



已编辑谢谢@Marco

我正在尝试编写一个函数应用程序,该应用程序从 URL 中获取 SVG 并将其转换为 PNG。 我知道有现有的 API 可以像 CloudConvert 一样做到这一点,但它们不能很好地与嵌入式字体配合使用,这对我来说是一个要求。

无论如何,我编写了一个非常基本的函数应用程序,此时只需下载一个文件。 在本地一切正常,但是当我发布到 Azure 时,我得到了An exception occurred during a WebClient request.

多亏了@Marco的建议,我从WebClient切换到HTTPWebRequest以获得更详细的错误处理,结果,我看到以下内容:

2018-10-11T13:53:53.558 [信息] 函数已启动 (id=e3cbda04-140e-4ef7-ad6c-c871ffe179dd(
2018-10-11T13:53:53.590 [信息] C# HTTP 触发器函数处理了一个请求。 2018-10-11T13:53:53.752 [信息] 下载失败
2018-10-11T13:53:53.752 [信息] 访问路径
"D:\Windows\system32\734e16961fc276df.svg"被拒绝。

我是否正在尝试做一些不可能的事情,或者是否有解决此问题的方法? 有没有办法在 Azure 函数中配置权限? 我需要拉下文件进行编辑,而不仅仅是使用字节数组。

非常感谢!

public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, 
TraceWriter log, ExecutionContext context)
{
log.Info("C# HTTP trigger function processed a request.");
// parse query parameter
string svgURL = req.GetQueryNameValuePairs()
.FirstOrDefault(q => string.Compare(q.Key, "l", true) == 0)
.Value;
if (svgURL == null)
{
// Get request body
dynamic data = await req.Content.ReadAsAsync<object>();
svgURL = data?.svgURL;
}
// download file from URL
var uniqueName = GenerateId() ;
try 
{ 
using (var client = new WebClient())
{
client.DownloadFile(svgURL, uniqueName + ".svg" );
}
}
catch (Exception e)
{
log.Info("Download Fail");
log.Info(e.Message);
}
}

解决此问题的最简单方法是使用临时存储。 我可以理解为什么 Azure 无论如何都不希望函数包含应用程序目录。 更新了下面的代码:

我替换了这个:

client.DownloadFile(svgURL, uniqueName + ".svg" );

有了这个:

client.DownloadFile(svgURL, Path.GetTempPath() + "\" + uniqueName + ".svg" );

像魅力一样工作。

编辑:下面是我进行此调用的GitHub存储库。 还有其他事情正在发生,但您可以看到我保存到临时存储的位置。
https://github.com/osuhomebase/SVG2PNG-AzureFunction