我想利用Validator.TryValidateValue()但不了解机制.说,我有以下内容:
public class User {
[Required(AllowEmptyStrings = false)]
[StringLength(6)]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和方法:
public void CreateUser(string name) {...}
Run Code Online (Sandbox Code Playgroud)
我的验证码是:
ValidationAttribute[] attrs = bit of reflection here to populate from User class
var ctx = new ValidationContext(name, null, null);
var errors = new List<ValidationResult>();
bool valid = Validator.TryValidateValue(name, ctx, errors, attrs);
Run Code Online (Sandbox Code Playgroud)
它工作正常,直到值name是null.我ArgumentNullException在实例化时得到ValidationContext并且不明白为什么.TryValidateValue()还要求非空上下文.我有一个值和一个要验证的属性列表.这是ValidationContext为了什么?
在一些类似企业的项目(.NET,WCF)中,我看到所有服务契约都接受一个Request参数并始终返回Response:
[DataContract]
public class CustomerRequest : RequestBase {
[DataMember]
public long Id { get; set; }
}
[DataContract]
public class CustomerResponse : ResponseBase {
[DataMember]
public CustomerInfo Customer { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
其中RequestBase/ResponseBase包含像ErrorCode,Context等常见的东西.服务方法和代理的实体都包含在try/catch中,因此检查错误的唯一方法是查看ResponseBase.ErrorCode(枚举).
我想知道如何调用这种技术以及为什么它比传递所需的方法参数和使用标准的WCF上下文传递/故障机制更好?
[Test]
public void Test1()
{
Trace.TraceInformation("Hello");
}
Run Code Online (Sandbox Code Playgroud)
从VS 2015运行时,输出窗口(测试)显示没有跟踪线:
------ Discover test started ------
NUnit Adapter 3.4.0.0: Test discovery starting
NUnit Adapter 3.4.0.0: Test discovery complete
========== Discover test finished: 9 found (0:00:01.325888) ==========
------ Run test started ------
NUnit Adapter 3.4.0.0: Test execution started
Running selected tests in C:\Projects\bla-bla.dll
NUnit3TestExecutor converted 9 of 9 NUnit test cases
NUnit Adapter 3.4.0.0: Test execution complete
========== Run test finished: 1 run (0:00:03.5445181) ==========
Run Code Online (Sandbox Code Playgroud)
我记得它在NUnit 2和VS 2013上运行良好.我是否需要以某种方式打开它?我app.config没有超越默认值<system.diagnostics>.
这是一个简单的控制台应用程序,我在命令提示符下运行:
using System;
using System.Threading;
namespace Test
{
internal class Runner
{
[STAThread]
static void Main(string[] args)
{
Console.WriteLine(Thread.CurrentPrincipal.GetType().Name);
Console.WriteLine(Thread.CurrentPrincipal.Identity.Name);
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出为"GenericPrincipal",空字符串为身份名称.为什么运行时构造GenericPrincipal而不是WindowsPrincipal?我如何强制它WindowsPrincipal从启动过程的安全令牌构建(在我的情况下为cmd.exe)?
假设我们有一个服务方法,它执行一些安全检查,从DB和第三方Web服务检索数据,构造MyDataDTO,将审计条目写回DB.我们想要结构良好,细粒度的错误代码,不是吗?我们是好孩子,并遵循标准的WCF错误处理指南:
[FaultContract(typeof(AccessDenied))]
[FaultContract(typeof(KeyNotFound))]
[FaultContract(typeof(WsFault))]
[FaultContract(typeof(DbFault))]
MyDataDTO GetData(string key);
Run Code Online (Sandbox Code Playgroud)
现在我们要添加一个更新数据的新方法.该方法在GetData()内部(或其主要部分)调用,执行验证添加更新数据.所以它必须具有GetData()重复的所有错误并加上自己的错误:
[FaultContract(typeof(InvalidState))]
[FaultContract(typeof(DataNotValid))]
[FaultContract(typeof(AccessDenied))]
[FaultContract(typeof(KeyNotFound))]
[FaultContract(typeof(WsFault))]
[FaultContract(typeof(DbFault))]
void UpdateData(MyDataDTO data);
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.这使我们甚至可以为xml生成我们可以为我们服务的消费者提供的文档,以便他们知道他们可以期待哪些错误代码.
现在假设我们有10个服务,每个服务有10个方法,比如上面的(甚至更复杂的).并且定义所有这些错误合同变成了噩梦,因为这是一个非常容易出错的过程:
我们不要在这里考虑界面版本控制:)
如果您在生产中支持WCF服务,那么您就可以了解情况.我们应该放弃故障合同并使用良好的旧C风格(比如具有DTOBaseErrorCode属性的基类)?减少错误粒度?如何确保文档正确/最新?我对一些最佳实践感兴趣.
我试图在我当前的项目中使用ServiceStack,但发现发布的二进制文件名称不强,所以我无法使用它开箱即用.当询问GitHub"为什么"时,我得到了以下答案:
mythz非常简洁,所以我不想再打扰他,并在这里问.我使用了许多开源.NET项目,如AutoMapper,NUnit,Moq,log4net,Ninject等,他们的版本都是强大的命名.在这里找到类似的问题,但这对我没有帮助.这是OSS的正常做法吗?为什么不发布签名和未签名的二进制文件?
.net open-source code-signing assembly-signing code-signing-certificate
我正在尝试升级到xUnit 2 beta(主要是因为更好的测试发现),但偶然发现IUseFixture<>:
public abstract class TestCaseBase : IUseFixture<SelfHostFixture>
{ /*common stuff here*/ }
public class Controller1Test : TestCaseBase {}
public class Controller2Test : TestCaseBase {}
Run Code Online (Sandbox Code Playgroud)
我发现new IClassFixture<>几乎就是我需要的东西,除了为每个后代类(Controller1Test,Controller2Test)而不是一次创建/处理fixture .好吧,我可以IClassFixture<SelfHostFixture>从基地向每个测试类移动声明,但为什么我会多次设置/部署我的服务器?ICollectionFixture<>没有为我工作(夹具的ctor从未被解雇).
基本上,我想要的是:
ICollectionFixture<>根本不起作用,因为同一集合中的测试不能并行运行,对吧?)我错过了什么?
可能重复:
如何使用反射检测字段上的"新"修改器?
有以下声明
public class B : A
{
public new string Name;
}
Run Code Online (Sandbox Code Playgroud)
如何确定该字段的FieldInfo实例是否具有"新"修饰符?
我有一个有效的ASP.NET MVC 3应用程序.该项目使用VS 2010构建,目标是.NET 4.0.现在我将其重新定位到.NET 4.5并成功重新编译.尝试将其部署到我们的测试服务器(Windows 2008 R2 SP1)现在失败:
错误代码:ERROR_APPPOOL_VERSION_MISMATCH更多信息:您尝试使用的应用程序池将"managedRuntimeVersion"属性设置为"v4.0".此应用程序需要'v4.5'.有关详情,请访问:http://go.microsoft.com/fwlink/?LinkId = 221672 #ERROR_APPPOOL_VERSION_MISMATCH.
服务器安装了.NET 4.5,但没有应用程序池4.5(因为它是在位升级,因为我理解4.0池应该没问题).客户端计算机具有VS 2012,因此Web Deploy 3(之前是Web Deploy 2).我还在服务器上安装了Web Deploy 3.
试图重新注册ASP.NET aspnet_regiis- 没有运气.
为什么我会收到错误以及如何解决?这太令人沮丧了......
ps发现类似的问题关于RC但它没有帮助
更新:
看起来这是微软自CTP以来没有修复的错误.IgnoreDeployManagedRuntimeVersion财产做了伎俩.多可惜!
我正在尝试异步填充我的缓存
static ConcurrentDictionary<string, string[]> data = new ConcurrentDictionary<string, string[]>();
public static async Task<string[]> GetStuffAsync(string key)
{
return data.GetOrAdd(key, async (x) => {
return await LoadAsync(x);
});
}
static async Task<string[]> LoadAsync(string key) {....}
Run Code Online (Sandbox Code Playgroud)
但这给了我错误:
无法将异步lambda表达式转换为委托类型'System.Func'.
异步lambda表达式可能返回void,Task或Task,其中任何一个都不能转换为'System.Func'.
据我所知,这是因为GetOrAdd()不是异步的.我该如何解决这个问题?
更新:
LazyAsync评论中的建议将在我的琐碎例子中起作用.或者,像这样的解决方法(绝对可以忍受它引入的一些开销):
public static async Task<string[]> GetStuffAsync(string key)
{
string[] d = null;
if (!data.ContainsKey(key))
d = await LoadAsync(key);
return data.GetOrAdd(key, d);
}
Run Code Online (Sandbox Code Playgroud)
那么问题就变成微软没有时间更新所有接口来支持异步,或者我正在尝试做一些非常错误的事情(而且ConcurrentDictionary不应该有GetOrAddAsync())?
.net ×8
c# ×3
.net-4.0 ×2
wcf ×2
asp.net ×1
async-await ×1
asynchronous ×1
code-signing ×1
iis-7.5 ×1
msdeploy ×1
nunit ×1
nunit-3.0 ×1
open-source ×1
principal ×1
reflection ×1
security ×1
soa ×1
testing ×1
validation ×1
webdeploy ×1
windows-7 ×1
xunit ×1
xunit.net ×1