我今天第一次给PowerShell(v3.0)拍摄了一个镜头,并且对它的一些错误处理概念实现的奇怪方式感到非常沮丧.
我编写了以下代码(使用远程注册表PowerShell模块)
try
{
New-RegKey -ComputerName $PCName -Key $Key -Name $Value
Write-Host -fore Green ($Key + ": created")
}
catch
{
Write-Host -fore Red "Unable to create RegKey: " $Key
Write-Host -fore Red $_
}
Run Code Online (Sandbox Code Playgroud)
(这只是一个片段)
显然,PowerShell的默认行为是不捕获非终止的错误.所以我按照不同的人的建议在我的脚本顶部添加了以下行:
$ErrorActionPreference = "Stop"
Run Code Online (Sandbox Code Playgroud)
在PowerShell ISE中执行此操作确实捕获了所有错误.但是,从终端执行以下命令仍然无法捕获我的错误.
来自ISE:
PS C:\windows\system32> C:\Data\Scripts\PowerShell\Error.ps1
Errorhandling: Stop
SOFTWARE\MySoftware does not exist. Attempting to create
Unable to create RegKey: SOFTWARE\MySoftware
Key 'SOFTWARE\MySoftware' doesn't exist.
Run Code Online (Sandbox Code Playgroud)
从命令行:
PS C:\Data\Scripts\PowerShell> .\Error.ps1
Errorhandling: Stop
SOFTWARE\MySoftware does not exist. Attempting to create
New-RegKey : Key …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的项目中创建一个在插件.dll中实现的类的实例来进行类型发现.我收到这个例外:
无法从程序集'SquidReports.DataCollector.Plugin.BES,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'加载类型'Action'.
这是我正在使用的确切方法签名:https: //msdn.microsoft.com/en-us/library/d133hta4(v = vs.110).aspx
换句话说,我试图根据程序集名称和类名生成对象,如下所示:
object modelObject = Activator.CreateInstance((string)modelInfo.AssemblyName, (string)modelInfo.ModelName);
Run Code Online (Sandbox Code Playgroud)
这里要注意的一个重要部分是我使用程序集的"短"名称而不是"完整"名称(包括Version,Culture和PublicToken).但是,MSDN明确指出:
'assemblyName'可以是以下任何一种:程序集的简单名称,没有其路径或文件扩展名.
例如,您可以为其路径和名称为.\ bin\TypeExtensions.dll的程序集指定TypeExtensions.
已签名程序集的全名,包括其简单名称,版本,区域性和公钥令牌; 例如,"TypeExtensions,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 181869f2f7435b51".
具体来说,我正在尝试创建一个在程序集'SquidReports.DataCollector.Plugin.BES'中定义的类'Action'的实例.我明确地将此程序集引用为完全相同*.cs文件顶部的using指令,我正在尝试创建该实例.
我从之前的问题/答案中尝试了以下建议:
清理你的解决方案,重建并再试一次这似乎适用于一些ASP.NET项目,但这是一个简单的旧控制台应用程序.
检查配置文件中引用的程序集同样,这是一个简单的控制台应用程序,仅在同一解决方案的不同项目中使用GAC和库
1.确保程序集位于正确的工作目录中:
我们到了...

2.确保程序集是磁盘上的相同版本
对...

3.最后的建议是使用fuslogvw.exe.
我没有使用该工具的经验,但有一件事我确实发现奇怪.在运行调试会话时,我的程序集的长命名和短命名版本都出现了:

我看了看两个日志.
这个命名短的版本确实会产生一些警告:
===预绑定状态信息===
LOG:DisplayName = SquidReports.DataCollector.Plugin.BES Partial)WRN:为程序集提供了部分绑定信息:
警告:程序集名称:SquidReports.DataCollector.Plugin.BES | 域ID:1
警告:仅提供部分程序集显示名称时发生部分绑定.
警告:这可能导致装订器装入错误的装配.
警告:建议为程序集提供完全指定的文本标识,
警告:它由简单的名称,版本,文化和公钥令牌组成.
警告:有关此问题的更多信息和常见解决方案,请参阅白皮书http://go.microsoft.com/fwlink/?LinkId=109270.
...但它以成功加载结束,它清楚地提到我的装配在正确的位置:
日志:尝试下载新的URL文件:/// C:/Source/C#/SquidReports/SquidReports.DataCollector/bin/x86/Debug/SquidReports.DataCollector.Plugin.BES.DLL.
长命名版本的日志不包含可疑消息.
还有什么想法吗?
编辑:这是Action类的最小定义.它纯粹是一个模型类.
public class Action : ICollectible
{
public Action()
{
// Empty constructor …Run Code Online (Sandbox Code Playgroud) 我正在考虑使用实时消息替换我们公司的监控仪表板.
在我们公司,我们有一个仪表板,显示超过700台物理机的(相当详细的)状态,以及添加的元信息.它大约在1.5年前由我的一位同事在ASP.NET Web Forms(我不喜欢)中构建,以使调度员能够协调我们的技术人员应该去解决问题的位置(这些机器位于不同的地理位置) ).
不幸的是,该应用程序使用30秒的完整页面自动刷新,后面有一个大查询.它很慢,它完全重置你的视图(正如我所说,仪表板包含超过700多台机器).我个人想改变这个.使用起来非常烦人.我们的调度员已经学会了接受这一点,但我认为他们应该得到更好的待遇.
我想在新的仪表板上显示相同的内容,但具有实时更新和"消息"日志.在我们公司,我们在MS堆栈上工作了大约90%,因此我计划使用ASP.NET MVC,SignalR,SQL Server和Knockout.
看看这个简单的图表:
+----+ +----+ +----+ +----+ +----+ +----+ +----+
| PC | | PC | | PC | | PC | | PC | | PC | | PC | ... ...
+--+-+ +--+-+ +-+--+ +--+-+ +--+-+ +--+-+ +--+-+
| | | | | | |
| +--+ +--+ +----+ <-+ <-+ <-+
| | | |
+---v---v-----v-----v+ +-----------------------+
| | TCP/IP | |
| Monitoring Backend +---------> Data …Run Code Online (Sandbox Code Playgroud) 注意:我考虑首先在DBA Exchange上发布这个,但考虑到这是一个.NET客户端问题,我认为最好先问这里.
我有两个存储在Oracle 11g开发服务器中的函数,这些函数使用ODP.NET调用(使用Oracle.ManagedDataAccess而不是Oracle.DataAccess).
这两个函数在SQL Developer中是闪电般快速的(有意义的是,它们只是简单的查询,只选择了大约20,000条记录),但是当使用ODP从我的C#应用程序中激发时,性能(使用System.Diagnostics.Stopwatch测量)并不是很好.净.
以下是结果:(忽略'转换时间和撰写时间,它们不是查询过程的一部分)
Connecting time - GET_TVM_ALL: 00:00:00.0553501
Query time - GET_TVM_ALL: 00:00:05.3467058
Conversion time: 00:00:07.6508273
Connecting time - GET_TVM_STATUS_ALL_FUNC: 00:00:00.0006773
Query time - GET_TVM_STATUS_ALL_FUNC: 00:00:00.0256008
Conversion time: 00:00:03.7280097
Composing time: 00:00:00.0157274
Total Elapsed: 00:00:16.7796351
Run Code Online (Sandbox Code Playgroud)
GET_TVM_ALL的执行时间为5秒,非常高.更令人惊讶的是,第二个查询要快得多.这很奇怪,因为毫无疑问,对于超过20倍的记录数量来说,这是一个更复杂的查询.
所以我换了它们,这就是结果:
Connecting time - GET_TVM_STATUS_ALL_FUNC: 00:00:00.0573807
Query time - GET_TVM_STATUS_ALL_FUNC: 00:00:05.2981962
Conversion time: 00:00:03.6474905
Connecting time - GET_TVM_ALL: 00:00:00.0007322
Query time - GET_TVM_ALL: 00:00:00.0070785
Conversion time: 00:00:07.2473809
Composing time: 00:00:00.0154049
Total Elapsed: 00:00:16.2268687
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,看起来第一个查询总是很慢,无论其内容如何.为了证明这一点,我做了一个愚蠢的虚拟函数:
CREATE OR REPLACE FUNCTION GET_DUMMY …Run Code Online (Sandbox Code Playgroud) 应我老板的要求,我创建了一小组脚本,用于定期监控某些设备和进程的状态.随后使用相对复杂的VBA模块处理此信息,该模块收集所有信息,应用公式,设置范围并生成图表等.
但是有两个问题:我是业余程序员,所以我的VBA例程效率很低.这对我来说不是一个大问题(我只是在跑步时起床喝咖啡),但对于其他用户来说,这可能很麻烦,因为不知道为什么这么长时间.我想要一个进度的图形表示.应用程序的配置是通过文本文件完成的.我想提供一个体面的GUI来设置配置.
为了实现这一点,我正在寻找一种让我的C#WinForms应用程序与我的VBA应用程序通信的方法.我知道如何从我的C#应用程序运行VBA例程,但我不知道如何让它们实时进行操作.
以下是我特别想要实现的两件事:
我已经考虑过通过标准输出进行通信.我知道如何使用C#/ .Net读取标准输出,但我不确定如何使用VBA写入StdOut流.
我相信很多人会指出我想要达到的目标是愚蠢和老式(或者完全没必要),但作为业余程序员,对我来说这似乎是一个非常具有挑战性和有趣的项目,可以教我一件事或两个.
我正在创建一个C#应用程序,它将在Kiosk风格的环境中锁定功能(键组合,窗口任务栏等).其中一个要求是,某些人仍然可以使用密钥组合和密码来突破应用程序.
应用程序本身已完成,但我还没有找到一种存储和检查密码的好方法.一切都应该存储在本地(没有检查网络数据库或其他).如何定义用于解锁我的应用程序的密码,同时使其灵活(无需重新编译应用程序即可更改密码).我怎样才能以安全的方式实现这一目标?
关于这一点还有其他几个问题,但我觉得它们中没有一个确实提供了可靠的答案.
我最近搞乱反思很多,我想检查实现某个接口的几个程序集中包含的类型.
所以我有一个名为BESCollector的类,它实现了ICollector
public class BESCollector : ICollector
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
在这里,我加载程序集,遍历所有类型,并查看该类型是否包含ICollector类型的接口...
Assembly pluginAssembly = Assembly.ReflectionOnlyLoadFrom(pluginConfig.AssemblyLocation);
IEnumerable<Type> types = pluginAssembly.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(ICollector)));
Run Code Online (Sandbox Code Playgroud)
......没有结果:(.调试时我可以清楚地看到它包含这种类型.我打破了if循环
Assembly pluginAssembly = Assembly.ReflectionOnlyLoadFrom(pluginConfig.AssemblyLocation);
IEnumerable<Type> types = pluginAssembly.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(ICollector)));
foreach (Type type in pluginAssembly.GetTypes())
{
Type[] interfaces = type.GetInterfaces();
if (interfaces.Contains(typeof(ICollector)))
{
Console.WriteLine(@"\o/");
}
}
Run Code Online (Sandbox Code Playgroud)
这些结果直接来自调试器.在这里你可以看到它interfaces包含一个Type,即ICollector:
- interfaces {System.Type[1]} System.Type[]
+ [0] {Name = "ICollector" FullName = "SquidReports.DataCollector.Interface.ICollector"} System.Type {System.ReflectionOnlyType}
Run Code Online (Sandbox Code Playgroud)
我要求的类型.GetInterfaces()显然是BESCollector:
+ type {Name = "BESCollector" FullName = "SquidReports.DataCollector.Plugin.BES.BESCollector"} System.Type {System.ReflectionOnlyType} …Run Code Online (Sandbox Code Playgroud) 我仍在尝试学习RxJava。有一件事我现在无法束手无策。每一篇试图学习我如何使用Rx的文章都向我展示了如何基于已经“可预测”的源(即一定数量的项目的序列(单个值或简单的Iterable))创建Observable。 。
通常,您会看到一些类似的内容 Observable.just()
Observable<String> observerable = Observable.just("Hello, world!");
Run Code Online (Sandbox Code Playgroud)
或Observable.from():
Observable.from("apple", "orange", "banana").subscribe(fruit -> System.out.println(fruit));
Run Code Online (Sandbox Code Playgroud)
很好,但是下面的用例呢?
我有不断通过套接字推送的消息(我没有构建它,我只是在集成)。我需要“观察”通过套接字推送的数据序列。
很多人似乎都指向Obserable.using()(这里是一个例子),但是我也不认为这是正确的解决方案。通过套接字推送的消息是不完整的,因为它们具有最大长度。我需要自己“构造”消息,因此需要在每次从套接字推送之间进行缓冲。
换句话说,我正在寻找一种方法来根据从套接字推入的数据自己构造消息,然后将其推入Observable。我一直在寻找在整个地方执行此操作的正确方法,但是我似乎找不到合适的解决方案。
我有一小段HTML,我想通过BeautifulSoup运行.我已经有了基本的导航功能,但这个让我很难过.
这是HTML的一个示例(完全构成):
<div class="textbox">
Buying this item will cost you
<img align="adsbottom" alt="1" src="/1.jpg;type=symbol"/>
silver credits and
<img align="adsbottom" alt="1" src="/1.jpg;type=symbol"/>
golden credits
</div>
Run Code Online (Sandbox Code Playgroud)
使用img标签的'alt'属性我希望看到以下结果: 购买此项目将花费您1银奖和1金奖
我不知道如何顺序循环遍历div-tag.我可以执行以下操作来提取div-tag中包含的所有文本
html = BeautifulSoup(string)
print html.get_text()
Run Code Online (Sandbox Code Playgroud)
获取div标签中包含的所有文本,但这会给我这样的结果: 购买此项目将花费您银奖和金币
同样,我可以通过这样做从img-tags获取alt属性的值:
html = BeautifulSoup(string).img
print html['alt']
Run Code Online (Sandbox Code Playgroud)
但当然这只给了我属性值.
如何以正确的顺序迭代所有这些元素?是否可以按连续顺序读取div元素中的文本和img-element的属性?
我是 Rx 的新手,所以我可能在这里犯了一些基本错误。
我想创建一个非常简单的套接字服务器,它可以使用 Observables 从客户端接收消息。为此,我使用 Rxx,它在 System.Net.Sockets 命名空间中提供扩展方法,还提供 ObserableTcpListener 静态工厂类。
这是我到目前为止所拥有的,几乎是从各种来源窃取的:
IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9001);
TcpListener listener = new TcpListener(endpoint);
IObservable<TcpClient> clients = listener
.StartSocketObservable(1)
.SelectMany<Socket, TcpClient>(socket => SocketToTcpClient(socket));
.Finally(listener.Stop)
clients.Subscribe(client =>
{
OnConnect(client).Subscribe(
message => OnMessage(client, message),
ex => OnException(client, ex),
() => OnCompleted(client));
});
private static IObservable<TcpClient> SocketToTcpClient(Socket socket)
{
TcpClient client = new TcpClient();
client.Client = socket;
return Observable.Return<TcpClient>(client);
}
private static IObservable<byte[]> OnConnect(TcpClient client)
{
return client.Client.ReceiveUntilCompleted(SocketFlags.None);
}
private static void OnMessage(TcpClient client, …Run Code Online (Sandbox Code Playgroud) 我对 Quarkus 应用程序中的配置进行了非常简单的调整ObjectMapper,如 Quarkus 指南所述:
@Singleton
public class ObjectMapperConfig implements ObjectMapperCustomizer {
@Override
public void customize(ObjectMapper objectMapper) {
objectMapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
objectMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
objectMapper.registerModule(new JavaTimeModule());
}
}
Run Code Online (Sandbox Code Playgroud)
我这样做是为了用@JsonRootName注释包装/解开我的对象:
@RegisterForReflection
@JsonRootName("article")
public class CreateArticleRequest {
private CreateArticleRequest(String title, String description, String body, List<String> tagList) {
this.title = title;
this.description = description;
this.body = body;
this.tagList = tagList;
}
private String title;
private String description;
private String body;
private List<String> tagList;
...
}
Run Code Online (Sandbox Code Playgroud)
当针对我的实际 API 时,这工作得很好curl,但是每当我在其中一个测试中使用 RestAssured 时,RestAssured 似乎不尊重我的 …
我的任务是创建一个Intranet Web应用程序.它最终将由位于NancyFx API之上的SPA前端(可能是Angular)组成.
坦率地说,我绝对没有使用Windows用户进行Auth的经验,因为一般不推荐(正确的),所以很难找到具体的信息.
我想根据发送每个请求的用户授权用户.但是,我不知道如何从Nancy的每个请求上下文中访问用户信息.我看过一下:
public class IndexModule : NancyModule
{
public IndexModule()
{
Get["/"] = parameters =>
{
var User = this.Context.CurrentUser;
return View["index"];
};
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,this.Context.CurrentUser似乎永远不会被填充null.
如何使用Windows用户填充每个请求上下文?
或者,我做错了吗?在南希处理Windows用户的推荐方法是什么?我已经研究了两天多了,而且我很担心告诉我的老板我不知道如何处理这个相当重要的问题.
c# ×8
.net ×2
java ×2
reflection ×2
sockets ×2
asp.net ×1
html ×1
interface ×1
interop ×1
kiosk ×1
knockout.js ×1
nancy ×1
objectmapper ×1
odp ×1
oracle ×1
passwords ×1
performance ×1
powershell ×1
python ×1
quarkus ×1
real-time ×1
rest-assured ×1
rx-java ×1
security ×1
signalr ×1
sql ×1
types ×1
vba ×1