当前位置: 首页 > 编程语言 > C#

自动锁定WebApi2控制器分享

时间:2023-04-10 17:33:06 C#

自动锁定WebApi2控制器当我使用WebApi1时,它工作正常。我开始在一个新项目中使用WebApi2,在尝试运行新测试后它抛出了这个异常:System.Reflection.TargetInvocationException:调用目标抛出了异常。--->System.Security.Cryptography.CryptographicException:pCertContext是无效句柄。atSystem.Security.Cryptography.CAPI.CertSetCertificateContextProperty(SafeCertContextHandlepCertContext,UInt32dwPropId,UInt32dwFlags,SafeLocalAllocHandlesafeLocalAllocHandle)atSystem.Security.Cryptography.X509Certificates.X509Certificate2.set_Archived(Booleanvalue)我的测试代码:[Theory,AutoMoqData]publicvoidapprove_status_code_is_returned(stringprivateKey,UsersControllersut){varresponse=sut.GetUser(privateKey);var结果=响应;Assert.Equal(HttpStatusCode.OK,result.StatusCode);如果我手动创建sut,测试用例确实有效:变量响应=sut.GetUser(私钥);var结果=响应;Assert.Equal(HttpStatusCode.OK,result.StatusCode);尝试模拟ControllerContext.RequestContext.ClientCertificate时似乎存在问题我正在尝试创建一个没有它的夹具(使用AutoFixture.Without()方法),但即使是旧测试也开始失败。我的AutoMoqDataAttribute:publicclassAutoMoqDataAttribute:AutoDataAttribute{publicAutoMoqDataAttribute():base(newFixture().Customize(newWebApiCustomization())){}}WebApi自定义:publicclassWebApiCustomization:CompositeCustomization{publicWebApiCustomization():base(newHttpRequestMessageCustomization(),newAutoMoqCustomization()){}}HttpRequestMessage自定义:publicclassHttpRequestMessageCustomization:ICustomization{publicvoidCustomize(IFixturefixture){fixture.Customize(c=>c.Without(x=>x.Content).Do(x=>{x.Properties[HttpPropertyKeys.HttpConfigurationKey]=newHttpConfiguration();}));}}UsersController://////处理用户的账户。///[RoutePrefix("api/v1/users/{privateKey:length(64)}")]publicclassUsersController:ApiController{privatereadonlyIUserModel_model;公共UsersController(IUserModel模型){_model=模型;}//////返回一个用户。//////的私钥用户。//////找到用户时返回带有用户数据的200(OK)。///找不到用户时返回404(未找到)。///[HttpGet][Route("")]publicHttpResponseMessageGetUser(stringprivateKey){UserProjection投影;尝试{projection=newUserProjection(_model.Get(privateKey));}catch(UserNotFoundException){返回新的HttpResponseMessage(HttpStatusCode.NotFound);.OK,投影);注意:原始答案要求为每个新的ApiController复制相同的自定义广义方法另一种方法是自动填充所有ApiControllers上的请求属性(从而避免免剪,复制和粘贴):internalclassApiControllerCustomization:ICustomization{publicvoidCustomize(IFixturefixture){fixture.Customizations.Add(newFiltering(后处理器(newMethodInvoker(newModestConstructorQuery()),newApiControllerFiller(),newApiControllerSpecification()));}privateclassApiControllerFiller:ISpecimenCommand{publicvoidExecute(objectspecimen,ISpecimenContextcontext){if(specimen==null)thrownewArgumentNullException("specimen");如果(上下文==null)抛出新的ArgumentNullException(“上下文”);vartarget=标本作为ApiController;if(target==null)thrownewArgumentException("标本必须是ApiController的一个实例。","标本");target.Request=(HttpRequestMessage)context.Resolve(typeof(HttpRequestMessage));}}privateclassApiControllerSpecification:IRequestSpecification{publicboolIsSatisfiedBy(对象请求t){varrequestType=requestasType;如果(requestType==null)返回false;返回类型(ApiController).IsAssignableFrom(requestType);对于Request属性,类型HttpRequestMessage的值是使用以下自定义构造的:internalclassHttpRequestMessageCustomization:ICustomization{publicvoidCustomize(IFixturefixture){fixture.Customize(c=>c.Without(x=>x.内容).Do(x=>x.Properties[HttpPropertyKeys.HttpConfigurationKey]=newHttpConfiguration()));}}将所有内容打包到复合定制中创建一个定制复合,如下所示-请注意AutoFixture定制的顺序很重要:AutoMoqCustomization()){}}希望对您有所帮助注意:假设UserController类通过其构造函数获取IUserModel。似乎ApiController的默认构造函数ApiController执行了一些工作(可能不仅仅是简单的赋值)。如果UserController类通过其构造函数获取IUserModel,则可以选择该构造函数(最贪婪)。更新:将HttpRequestMessageCustomization自定义替换为以下内容:internalclassApiControllerCustomization:ICustomization{publicvoidCustomize(IFixturefixture){fixture.Customize(c=>c.Without(x=>x.Content).Do(x=>x.属性[HttpPropertyKeys.HttpConfigurationKey]=newHttpConfiguration()));fixture.Customize(c=>c.OmitAutoProperties().With(x=>x.Request,fixture.Create()));}}并且原始测试将正常执行。根据Nikos的回答:这是使用此自定义的更通用的方法,其中可以提供控制器类型,并且自定义可用于任何控制器内部类WebApiCustomization:ICustomizationwhereTControllerType:ApiController{publicvoidCustomize(IFixturefixture){fixture.Customize(c=>c.Without(x=>x.Content).Do(x=>x.Properties[HttpPropertyKeys.HttpConfigurationKey]=newHttpConfiguration()));fixture.Customize(c=>c.OmitAutoProperties().With(x=>x.Request,fixture.Create()));}}然后使用如下:以上是C#学习教程:自动锁定WebApi2controller分享的所有内容,如果对大家有用还有自己需要进一步学习C#学习教程,希望大家多多指教多加注意——varfixture=newFixture().Customize(newWebApiCustomization());varsut=fixture.Create();本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: