代码之家  ›  专栏  ›  技术社区  ›  Stuart

系统中缺少方法。网状物Http。ApiController。get_请求()

  •  13
  • Stuart  · 技术社区  · 7 年前

    我有一个控制器。

        public sealed class AccountsController : BaseApiController
        {
            private readonly IDatabaseAdapter _databaseAdapter;
            public AccountsController(IDatabaseAdapter databaseAdapter)
            {
                _databaseAdapter = databaseAdapter;
            }
    
            [AllowAnonymous]
            [Route("create")]
            public async Task<IHttpActionResult> CreateUser(CreateUserBindingModel createUserModel)
            {
                if (!ModelState.IsValid)
                    return BadRequest(ModelState);
                if (! await _databaseAdapter.DoesAgentExist(createUserModel.UserName))
                    return BadRequest();
                if (await _databaseAdapter.DoesAgentHaveAccount(createUserModel.UserName))
                    return BadRequest();
    
                // Create account.
                var password = PasswordHelper.GeneratePassword(32);
                createUserModel.Password = password;
                createUserModel.ConfirmPassword = password;
                var user = new ApplicationUser
                {
                    UserName = createUserModel.UserName,
                };
                var addUserResult = await AppUserManager.CreateAsync(user, createUserModel.Password);
                if (!addUserResult.Succeeded)
                    return GetErrorResult(addUserResult);
                var locationHeader = new Uri(Url.Link("GetUserById", new { id = user.Id }));
                return Created(locationHeader, ModelFactory.Create(user));
            }
        }
    

    http://localhost:59430/api/accounts/create 用户代理:Fiddler

    内容类型:应用程序/json接受:应用程序/json主机: 本地主机:59430内容长度:106

    {“UserName”:“a.xxxxx”,“Password”:“xxxxxx”,

    具体到以下几行:

    var addUserResult = await AppUserManager.CreateAsync(user, createUserModel.Password);

    然后出现以下异常

    {“message”:“发生错误。”,“exceptionMessage”:“方法 未找到:'系统。网Http。HttpRequestMessage 系统网状物Http。ApiController。get_Request()'。“,”exceptionType“: “System.MissingMethodException”,“stackTrace”:“at” WebAuth。控制器。BaseApicController。get\u AppUserManager()\r\n位于 WebAuth。控制器。会计控制人。d__3。MoveNext()输入 C: \用户\艺术\文档\ Visual Studio 2017\Projects\WebAuth\WebAuth\Controllers\accountscocontroller。cs:线路 76\r\n---exception所在的上一个位置的堆栈结束跟踪 被抛出---\r\n 系统运行时。编译器服务。任务等待者。ThrowForNonSuccess(任务 任务\r\n位于 系统运行时。编译器服务。任务等待者。HandleNonSuccessAndDebuggerNotification(任务 系统穿线。任务。TaskHelpersExtensions。d_3'1。MoveNext()\r\n--- 来自引发异常的前一个位置的堆栈结束跟踪 ---\在系统上。运行时。编译器服务。任务等待者。ThrowForNonSuccess(任务 任务\r\n位于 系统运行时。编译器服务。任务等待者。HandleNonSuccessAndDebuggerNotification(任务 系统网状物Http。控制器。ApiControllerActionInvoker。d__0。MoveNext()\r\n--- ---\在系统上。运行时。编译器服务。任务等待者。ThrowForNonSuccess(任务 系统运行时。编译器服务。任务等待者。HandleNonSuccessAndDebuggerNotification(任务 任务\r\n位于 系统网状物Http。控制器。ActionFilterResult。d__2。MoveNext()\r\n--- ---\在系统上。运行时。编译器服务。任务等待者。ThrowForNonSuccess(任务 任务\r\n位于 系统运行时。编译器服务。任务等待者。HandleNonSuccessAndDebuggerNotification(任务 任务\r\n位于 系统网状物Http。调度员。HttpControllerDispatcher。d__1。MoveNext()“ }

    有人知道发生了什么吗?我不知道为什么它找不到那种方法。

    我的垃圾箱文件夹包含

    系统网状物Http。dll 系统网Http。dll

    ApplicationUserManager

    public sealed class ApplicationUserManager : UserManager<ApplicationUser>
        {
            public ApplicationUserManager(IUserStore<ApplicationUser> store) : base(store)
            {
            }
            public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options,
                                                        IOwinContext context)
            {
                var appDbContext = context.Get<ApplicationDbContext>();
                var appUserManager = new ApplicationUserManager(new UserStore<ApplicationUser>(appDbContext));
    
                appUserManager.UserValidator = new UserValidator<ApplicationUser>(appUserManager)
                {
                    AllowOnlyAlphanumericUserNames = true,
                    RequireUniqueEmail = false,
                };
                appUserManager.PasswordValidator = new PasswordValidator
                {
                    RequiredLength = 12,
                    RequireNonLetterOrDigit = true,
                    RequireUppercase = true,
                    RequireLowercase = true,
                    RequireDigit = true
                };
                appUserManager.MaxFailedAccessAttemptsBeforeLockout = 3;
                appUserManager.DefaultAccountLockoutTimeSpan = TimeSpan.FromHours(1);
                return appUserManager;
            }
        }
    

    BaseApicController

    public class BaseApiController : ApiController
        {
            private ModelFactory _modelFactory;
            private readonly ApplicationUserManager _applicationUserManager = null;
            protected ApplicationUserManager AppUserManager => _applicationUserManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
            protected ModelFactory ModelFactory => _modelFactory ?? (_modelFactory = new ModelFactory(Request, AppUserManager));
            protected IHttpActionResult GetErrorResult(IdentityResult result)
            {
                if (result == null)
                    return InternalServerError();
    
                if (result.Succeeded) return null;
    
                if (result.Errors != null)
                    foreach (var error in result.Errors)
                        ModelState.AddModelError(string.Empty, error);
    
                if (ModelState.IsValid)
                    return BadRequest();
    
                return BadRequest(ModelState);
            }
            private readonly ApplicationRoleManager _appRoleManager = null;
            protected ApplicationRoleManager AppRoleManager => _appRoleManager ?? Request.GetOwinContext().GetUserManager<ApplicationRoleManager>();
        }
    
    1 回复  |  直到 7 年前
        1
  •  51
  •   Stuart    7 年前

    当我构建时,有构建警告进入输出窗口,但没有显示在主错误/警告窗口中。

    他们与程序集冲突有关,并建议将程序集重定向放到web中。配置。

    例如

          <dependentAssembly>
            <assemblyIdentity name="System.Net.Http" culture="neutral" publicKeyToken="b03f5f7f11d50a3a" />
            <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
          </dependentAssembly>