哪些工具可用于针对C#代码进行静态分析?我知道FxCop和StyleCop.还有其他人吗?我之前遇到过NStatic,但是它一直处于开发阶段,看起来像是永远的 - 它看起来很漂亮,看起来很少见,所以如果它能看到光明的一天会很好.
沿着这些相同的路线(这主要是我对静态分析的兴趣),用于测试多线程问题(死锁,竞争条件等)代码的工具似乎也有点稀缺.刚出现了Typemock Racer,所以我会看着它.除此之外还有什么?
关于您使用的工具的现实意见表示赞赏.
我有一个名为ServerClient的Visual Studio(客户端)生成的代理对象.我试图在使用此代码打开新连接之前设置ClientCredentials.UserName.UserName/Password:
InstanceContext context = new InstanceContext(this);
m_client = new ServerClient(context);
m_client.ClientCredentials.UserName.UserName = "Sample";
Run Code Online (Sandbox Code Playgroud)
一旦代码命中UserName行,它就会失败并显示"Object is read-only"错误.我知道如果连接已经打开或出现故障会发生这种情况,但此时我还没有调用context.Open().
我已将Bindings(使用netTcpBinding)配置为使用Message作为其安全模式,并将MessageClientCredentialType设置为UserName.
有任何想法吗?
人们如何单元测试他们的业务应用程序?我已经看到很多单元测试的例子都是"简单测试"的例子.防爆.一个计算器.人们如何对数据量大的应用进行单元测试?你是如何整理样本数据的?在许多情况下,一个测试的数据可能根本不适用于另一个测试,这使得很难只拥有一个测试数据库?
测试代码的数据访问部分非常简单.它正在测试所有针对似乎难以测试的数据的方法.例如,想象一个发布过程,其中存在大量数据访问以确定发布的内容,数字被调整等.发生了许多临时步骤(并且需要进行测试)以及之后的测试以确保发布是成功的.其中一些步骤实际上可能是存储过程.
在过去,我尝试将测试数据插入测试数据库,然后运行测试,但老实说,编写这种代码非常痛苦(并且容易出错).我还尝试过预先构建测试数据库并回滚更改.这工作正常,但在许多地方你也不能轻易做到这一点(许多人会说这是集成测试;所以,我仍然需要能够以某种方式测试它).
如果答案是没有一种很好的方法来处理这个问题,而且目前只是很糟糕,那么知道也是有用的.
任何想法,想法,建议或提示都表示赞赏.
我们在 ASP.NET Core 3.1 网站中使用 ILogger,使用 Microsoft.ApplicationInsights.AspNetCore 包,版本 2.14。我们正在尝试启用将信息性消息记录到 App Insight 中,例如。_logger.LogInformation("这里的信息')
在 ConfigureServices 中启动时,我们启用 App Insights:
services.AddApplicationInsightsTelemetry();
Run Code Online (Sandbox Code Playgroud)
我们的 appsettings.json 文件中有以下内容:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ApplicationInsights": {
"InstrumentationKey": "12345678-1234-5678-1234-1234567890ab",
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
Run Code Online (Sandbox Code Playgroud)
它正确获取应用程序洞察键(我们确实获得了正常指标、日志条目,例如异常),但是我们对 logger.LogInformation("Info here") 的调用都没有被发送/记录在 App Insight 仪表板中。
我发现了这个类似的问题:
ILogger 不尊重 Application Insights 的日志级别
但是答案仍然没有真正解决如何能够从 appsettings.json 文件更改日志级别与将日志级别硬编码到代码中。
从文档来看,这似乎应该“正常工作”,但似乎没有。
? https://docs.microsoft.com/en-us/azure/azure-monitor/app/ilogger#control-logging-level
我们哪里错了?
我有一个继承过程,我正在从另一种语言转换为C#.过程中的许多步骤循环通过可以进行大量记录(100K-200K)来进行计算.作为这些过程的一部分,它通常会查找另一个列表以检索某些值.我通常会把这种事情转移到一个SQL语句中(我们已经能够实现这一点),但在这些情况下,实际上没有一种简单的方法可以做到这一点.在某些地方,我们试图将代码转换为存储过程,并认为它的工作效果不如我们希望的那样好.
实际上,代码执行此操作:
var match = cost.Where(r => r.ryp.StartsWith(record.form.TrimEnd()) &&
r.year == record.year &&
r.period == record.period).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
cost是本地List类型.如果我只在一个字段上进行搜索,我可能只是将其移动到字典中.记录也不总是唯一的.
显然,这真的很慢.
我遇到了可以构建索引的开源库I4O,但是在各种查询中我都失败了(我没有时间尝试调试源代码).它也不适用于.StartsWith或.Contains(StartsWith更重要,因为许多原始查询利用了搜索"A"会在"ABC"中找到匹配的事实).
有没有其他项目(开源或商业)做这种事情?
编辑:
我根据反馈进行了一些搜索,发现了Power Collections,它支持具有非唯一键的字典.
我测试了ToLookup()效果很好 - 它仍然不如原始代码快,但它至少是可以接受的.它从45秒下降到3-4秒.我将看看Trie结构的其他看起来.
谢谢.
我正在尝试将ASP.NET MVC 3应用程序部署到Windows 2008 R2框中.我运行Web平台安装程序以安装MVC 3位和基本IIS设置.我创建了一个新文件夹C:\ Website然后创建了一个新网站并将其指向此文件夹.
我看到有一个新的应用程序池缩进,"ApplicationPoolIdentity"与IIS 6不同(并且是一个"特殊"用户帐户,该文件夹中的安全选项卡实际上不可用).我通过键入帐户"IIS AppPool\DefaultAppPool"手动分配了对C:\ Website文件夹的权限,并为其提供了Read&Execute/List文件夹内容/读取权限(具体为:Traver文件夹/ excute文件,List文件夹/读取数据,读取属性,读取扩展属性,读取权限).
此网站的应用程序池是针对.NET框架的v4,集成管道配置的.
在IIS身份验证中启用"匿名身份验证".
我的网站在web.config文件中具有身份验证模式="Windows".这是我第一次使用Windows身份验证.如果重要,则Web服务器是域的一部分.
当我尝试访问该站点时,我得到一个拒绝访问错误,401.2.我认为它可能与Windows身份验证设置有关,因此我修改了web.config并将身份验证模式设置为None.我犯了同样的错误.
如果我进入网站,IIS /身份验证并启用Windows身份验证,它会提示我输入用户名/密码.如果我输入我的凭据就行了.但是,我担心它只能起作用,因为它实际上模仿我在服务器上(我可以访问所有内容).我真的不需要/想在网站上模仿 - 我只使用Windows身份验证,因此我们不必维护两组登录.该网站仅检查用户所属的角色,以选择性地显示/隐藏内容.网站上的默认页面没有在控制器上设置任何[授权]属性.在web.config文件中配置.
次要问题 - 为什么我会被提示输入我的用户名/密码?挑战/响应不会自动发生,只有在身份验证失败时才会提示吗?
显然这里有一些互动,我不明白,但我不知道是什么.我在事件日志中没有看到任何有用的错误.
我已经搜索了错误并尝试了一些修复程序,例如,我尝试使用命令行重置ASP.NET配置:aspnet_regiis -i没有任何运气.
解决
我能够让这个工作.在网站配置下有一个".NET授权"选项.这被配置为拒绝所有匿名用户.我删除了该规则,然后添加了允许所有匿名用户的规则.现在我可以在没有登录的情况下访问该站点.然后我进入IIS身份验证并启用了Windows身份验证并禁用了匿名身份验证.
Internet Explorer在不提示的情况下传递凭据.Firefox会提示输入凭据.有一个配置设置来配置:
我正在测试的机器没有Chrome,但这似乎对我的开发工作正常.机.
我有一个使用 NetHttpBinding 的 WCF Web 服务。我知道我可以通过以下方式控制哪些协议可用/使用:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls|SecurityProtocolType.Tls11 |SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)
但是在进行服务调用后是否可以确定实际使用的是哪种协议?
我可以明确地将其设置为一种协议,然后循环并进行调用以查看它是否成功,然后重复,但这看起来确实很笨重/缓慢。有更好的想法吗?
我在 ASP.NET MVC Core 2 应用程序中配置默认主页时遇到了一些困难。我似乎无法让路由映射到正确的主页,默认情况下不使用参数,例如。https://localhost:44362
我真的不喜欢将控制器放在 Controllers 文件夹中、在视图中查看和在模型中查看模型的默认约定。我更喜欢按功能分组。
所以我有一个这样的结构:
Features
Home
HomeController.cs
HomeIndex.cshtml
HomeViewModel.cs
Other
OtherController.cs
OtherIndex.cshtml
OtherViewModel.cs
Run Code Online (Sandbox Code Playgroud)
一切正常,除了当没有提供路径时,我似乎无法将默认页面设为 /Home/Index。当 HomeController 在 Controllers 中时一切正常(以及在 Views/Home 中的 Index),但是一旦我移动它,事情就坏了。
我使用的是默认的 Startup.cs 文件,所以我有一个如下所示的 Configure 方法:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
Run Code Online (Sandbox Code Playgroud)
我做了一些搜索,看起来在 ConfigureServices 方法中使用它应该可以工作:
services.AddMvc().AddRazorPagesOptions(options =>
{
options.Conventions.AddPageRoute("", "/Home/Index");
});
Run Code Online (Sandbox Code Playgroud)
这会抛出一个:值不能为空或为空 (pageName) 异常。我也试过“/”、“/Home/Index”作为参数。最后,为了更好的衡量,我还交换了上述参数,以防万一我误解了每个参数的用法。
在每种情况下,都不显示页面。如果我输入完整的 URL /Home/Index,它就可以工作。我还尝试将 [Route("Home")] …
我想我可能会错过一些关于这应该如何工作的东西.我有一些导入文件的代码.它循环遍历每条记录,进行一些处理,然后通过DbContext实例将该记录添加到表中.
我初始化DbContext如下:
protected void ResetDbContext()
{
if (_db != null)
_db.Dispose();
_db = new AppDBEntities();
_db.Configuration.AutoDetectChangesEnabled = false;
_db.Configuration.ValidateOnSaveEnabled = false;
}
Run Code Online (Sandbox Code Playgroud)
我的主循环看起来像这样:
foreach (var rec in engine)
{
var record = new CommonImportRecord(rec);
ProcessRecord(record, options, index);
index++;
}
_db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
ProcessRecord 看起来像这样:
protected async Task<int> ProcessRecord(CommonImportRecord record, ImportOptions options, int index)
{
DisplayProcessStatus(index, options);
// Code removed which fills in various properties of the record
_db.MyTable.Add(record);
if (index % options.UpdateInterval == 0)
{
return await _db.SaveChangesAsync(); …Run Code Online (Sandbox Code Playgroud) .net c# task-parallel-library async-await entity-framework-6
我有一些代码接受DataTable作为参数,并计算DataTable中几个列的总和.我认为能够传入一个lambda表达式可能会很好,这个表达式会对我总计的列执行过滤.
这是代码的一部分:
public TrafficTotals CalculateTotals(DataTable table)
{
TrafficTotals total = new TrafficTotals();
total.TotalTraffic = table.AsEnumerable().Sum(p => p.Field<int>("Converted"));
// More stuff
Run Code Online (Sandbox Code Playgroud)
我可以直接在代码中手动将过滤器添加到表达式中:
var filteredTotal = table.AsEnumerable().Where(p => p.Field<string>("MyColumn") == "Hello").Sum(p => p.Field<int>("Converted"));
Run Code Online (Sandbox Code Playgroud)
但相反,我想将"Where"部分作为lambda表达式传递,但我不断迷失在语法中以获得正确的参数.
我有几种方法可以解决这个问题,但实际上并没有涉及到lambda,但它似乎是处理这个问题的好方法.
有任何想法吗?
我想我在这里遗漏了一些东西.我有一个WPF表单,它有一些方法,我需要从外部源(通常在非UI线程)调用.我检索对表单的引用,然后尝试通过Dispatcher.Invoke调用该方法,以便它被编组到UI线程.问题是这个代码不会起作用,因为Invoke触发一个Action,所以结果总是一个空字符串(即使文档说Invoke应该是同步的).
public string GetValueById(string id, string value)
{
Application.Current.Dispatcher.Invoke(() =>
{
var main = Application.Current.MainWindow as MainWindow;
if (main != null)
{
return main.GetValue(id);
}
});
return "";
}
Run Code Online (Sandbox Code Playgroud)
我无法完全理解如何使这项工作.
c# ×8
asp.net-core ×2
linq ×2
wcf ×2
.net ×1
.net-core ×1
appinsights ×1
async-await ×1
deployment ×1
iis-7.5 ×1
unit-testing ×1
wpf ×1