我已设置Windows服务来管理自定义.Net任务。组织为:
-Windows Service监视计划,并根据需要启动工作程序.exe。
-Worker .exe(轻量级Winform应用程序)使用命令行参数来拉起DLL(插件)并运行一些代码。
这已经好几个月了。我最近将其迁移到Server 2012(从2008 IIRC起)-这可能无关紧要,但这很难说。自迁移后的一段时间以来,我遇到了一个问题,其中worker .exe在被process.start()调用后“启动”,但没有到达我的代码。没有错误或任何东西,它似乎在应用程序加载期间冻结。
启动它的服务代码是相当标准的。
// Create a temp folder and copy the executable to it
// (so the source exe isn't always in use and can be swapped out)
Process p = new Process();
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = Path.Combine(temp.Path, Path.GetFileName(ExecutablePath));
psi.Arguments = CommandLineArgs.ConcatenateList(" ");
psi.UseShellExecute = false;
psi.RedirectStandardError = true;
psi.RedirectStandardInput = true;
psi.RedirectStandardOutput = true;
psi.CreateNoWindow = true;
psi.ErrorDialog = false;
psi.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo = psi;
p.Start();
// read …Run Code Online (Sandbox Code Playgroud) 我希望OkObjectResult通过我拥有的自定义 JSON 解析器运行来自 api 的所有响应。解析器依赖于一些特定于请求的数据——即用户的角色。它实际上类似于控制器上的 Authorize 属性,但用于从 API 传递到 UI 的数据传输对象。
我可以通过 AddJsonOptions 在配置服务中添加解析器,但它无权访问那里的用户信息。
如何将基于请求的值传递给该解析器?我是在寻找某种自定义中间件,还是其他什么?
作为示例,如果我有一个带有一些自定义属性装饰器的对象,如下所示:
public class TestObject
{
public String Field1 => "NoRestrictions";
[RequireRoleView("Admin")]
public String Field2 => "ViewRequiresAdmin";
}
Run Code Online (Sandbox Code Playgroud)
并使用不同的角色调用我的自定义序列化器,如下所示:
var test = new TestObject();
var userRoles = GetRoles(); // "User" for the sake of this example
var outputJson = JsonConvert.SerializeObject(test,
new JsonSerializerSettings {
ContractResolver = new MyCustomResolver(userRoles)
});
Run Code Online (Sandbox Code Playgroud)
然后输出 JSON 将跳过用户无法访问的任何内容,如下所示:
{
"Field1":"NoRestrictions",
// Note the absence of Field2, since it has [RequireRoleView("Admin")]
}
Run Code Online (Sandbox Code Playgroud)