我正在尝试创建一个使用 ffmpeg 的函数,到目前为止,除了 -version 命令之外,我还无法获得任何其他命令来正常工作。当我尝试运行一个简单的ffmpeg -i {input file path} {output file path}
命令时,该函数似乎卡住了 3-4 分钟(在创建空输出文件的过程中),然后重试并产生错误“文件已存在”。我尝试在 64 位 ffmpeg.exe 和 32 位 ffmpeg.exe 之间切换,该函数同时作为 32 位和 64 位函数运行。下面包含我的代码和尝试运行代码的相关日志,如果有人能告诉我我做错了什么或如何让该过程正常工作,我将不胜感激。预先感谢,Cuan
编辑:该过程适用于具有相同文件的 kudu,输出显示在底部。在 kudu 上,该过程运行了不到半分钟,显然有什么原因导致函数过程挂起,如果有人有建议,我们将不胜感激。再次感谢爨。
第二次编辑:我尝试将 -y 添加到命令末尾,这有效,因为它不再抱怨覆盖,但可惜它现在由于超时而挂起两次。(底部输出)
编辑第三个:azure有一种方法可以让你在本地运行函数,我的函数在本地版本上遇到了相同的问题,但是:事实证明,实际处理是在几秒钟内完成的,因此需要永远决定编写写入文件 - 如果您在进程运行约 10 秒后手动终止进程,则文件会立即写入。再次感谢任何帮助。爨。
运行.csx:
using System.Net;
using System;
using System.Diagnostics;
using System.ComponentModel;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
Process process = new Process();
process.StartInfo.FileName = @"D:\home\site\wwwroot\HttpTestFunction\ffmpeg64.exe";
string tmp = String.Format("-i \"" + "Airdocs …
Run Code Online (Sandbox Code Playgroud) 对于具有大量输出或错误的进程,尝试使用简单的方法重定向标准输出和错误
string output = process.StandardOutput.ReadToEnd();
string err = process.StandardError.ReadToEnd();
process.WaitForExit();
Run Code Online (Sandbox Code Playgroud)
将导致程序挂起,并且永远不会真正完成。
在我们的 API 上,我们需要接收 json,将其反序列化为接口,设置一个字段,然后将其发送出去。为了实现这一点,我在两端将 jsonConvert 设置为使用 TypeNameHandling.All。有问题的端点应该被相当锁定,但总有可能有人获得访问权限并使用危险的构造函数或垃圾收集方法将 $type 设置为系统类。
我的问题是在尝试反序列化之前澄清类型的名称空间是否足够安全?或者是否仍然存在 json 中具有危险类类型的子对象之类的风险?如果仍然存在风险或我错过的漏洞,我可以采取哪些其他步骤来减轻危险?
我们的公司名称位于我们使用的每个命名空间的开头,因此在下面的代码中,我们只需检查 json 中设置的类型是否以我们的公司名称开头。开头的 {} 只是让编译器知道在检查后不需要将 JObject 保留在内存中。
{ //check the type is valid
var securityType = JsonConvert.DeserializeObject<JObject>(request.requestJson);
JToken type;
if (securityType.TryGetValue("$type", out type))
{
if (!type.ToString().ToLower().StartsWith("foo")) { //'foo' is our company name, all our namespaces start with foo
await logError($"Possible security violation, client tried to instantiate {type}", clientId: ClientId);
throw new Exception($"Request type {type} not supported, please use an IFoo");
}
}
else
{
throw new Exception("set a …
Run Code Online (Sandbox Code Playgroud) 我有一个复杂对象的字典,只要数据库及其源数据发生更改,就需要更新该字典。条目可能已更改、添加或删除,因此本质上我们需要重新创建/重新加载整个词典。据我所知,有几种不同的方法可以做到这一点,我想知道是否有最佳实践?(或者如果我对比较的理解是正确的)
锁定语句,逐项清除和添加
lock (myLock){
myDict.Clear();
foreach (var itemToAdd in itemsToAdd)
myDict.Add(config.key, config);
}
Run Code Online (Sandbox Code Playgroud)
逐项添加到字典中,然后删除不应该存在的内容
var tmpDict = LoadDictionary();
foreach(var key in myDict.Keys.ToList()) //check for deleted keys
if(!tmpDict.ContainsKey(key))
myDict.TryRemove(key, out _);
foreach(var pair in tmpDict) //update or add every key
myDict[pair.Key] = pair.Value;
Run Code Online (Sandbox Code Playgroud)
进行直接交换(合并将军的评论)
public ConcurrentDictionary<string, string> myDict = new ConcurrentDictionary<string, string>();;
public void UpdateDictionary(){
Interlocked.Exchange(ref myDict, LoadDictionary());
}
Run Code Online (Sandbox Code Playgroud)
据我所知,只要您从不在其他地方存储对字典的引用(因为您不会获得对引用字典的任何更新),最后一个选项就应该可以正常工作。第一个选项将停止任何访问,直到更新字典(如果担心过时的值,则更安全,并且对于较小的字典来说应该没问题),第二个选项避免锁定对象并避免丢失引用,但运行您收到更新提示后几毫秒/秒内访问旧值的风险
这是一个格式相当糟糕的问题(抱歉),但是是否有执行上述操作的最佳实践/标准?和/或上述代码片段中是否存在重大漏洞?
编辑:在我的用例中,我们有几个独立的服务正在运行,数据库将被其中一个服务更改,所以我们不能先更新字典,但有点过时也没什么大不了的。
Edit2:误解了 interlocked.exchange 的作用,但仍然改进了我的解决方案