如果您有关于Visual Studio特性和功能的特定问题,请使用此标记。不要在有关代码的问题上使用此标记,这些代码恰好是在Visual Studio中编写的。考虑标记您的问题链接到的确切技术区域,并标记更具体的Visual Studio版本。请在您的问题中提及您的确切VS版本,版本和更新级别。
我正在研究ASP.NET Core 2.2。用户首次注册后,用户被重定向到其个人页面,该页面需要登录。
的脚本 <script> $('#btnregister').on('click', function (e) { e.preventDefault(); $.ajax({ type: 'POST', url: '@Url.Action("Register", "Account")', data: { username: $("#username").val(), pass: $('#pass').val() } }).done(function (res) { if (res.status === 'success') { window.location.href = 'https://localhost:5001/UserPanel/UserInfo/Index'; }); }); </script> 这是我的代码:: AccountController 在此代码中,用户首先注册,然后将用户登录并重定向到路径[HttpPost] public async Task<IActionResult> Register(string username, string pass) { var user = new ApplicationUsers { PasswordHash = pass, UserName = username, }; // Register IdentityResult registerResult = await _userManager.CreateAsync(user, pass); if (registerResult.Succeeded) { registerResult = await _userManager.AddToRoleAsync(user, "normaluser"); } // Login var result = await _signInManager.PasswordSignInAsync(username, pass , true, lockoutOnFailure: false); if (result.Succeeded) { return Json(new { status = "success" }); } } 用户成功地将用户重定向到指定的路径,并显示页面。但是,一旦他单击任何按钮,用户就会登录。 如何防止用户在注册后登录? 基于代码,您正在使用ASP.NET核心身份来实现寄存器和登录功能。 注册用户成功后,您可以尝试检查Aspnetusers表,是否已插入数据库中,如果已启用了电子邮件确认,我们需要使用户emailCondencrend columsed列为window.location.href = 'https://localhost:5001/UserPanel/UserInfo/Index'; 。 ,默认情况下,使用身份登录成功后,用户身份将存储在cookie中,因此登录的问题可能与身份cookie相关。 trory使用F12开发人员工具检查身份cookie到期时间: 如果问题与cookie到期的时间有关,则可以使用以下代码来延长到期时间: True 更多详细信息,请参阅SP.NET核心身份cookie设置。 Besides,您也可以检查浏览器设置,确保它不会禁用/清除cookie。
我正在使用ASP.NET Core MVC架构开发聊天应用程序。 在本质上,该项目运行良好,可以在IIS Express上运行。但是后来我发现现在IDE不起作用。该项目无法运行II Express。
error:程序'[18268] iisexpress.exe'已使用代码0(0x0)。
几周后,我在视觉工作室里遇到了一些问题。 症状之一是我无法重新认证我的Azure帐户。 在某个地方时机 我能够找到一些日志...
Visual Studio Maui Android发布Jarsigner错误
几天前,我将Visual Studio 2022更新为版本17.13.0。更新后,我再也无法将我的Android Maui应用程序(.AAB)推向Playstore。 签署期间发生错误
Visual Studio 2022丢失了构建Action Property的选项
今天在VS2022中使用C#Winforms应用程序时,我注意到我在下拉列表中不再有任何项目以进行构建操作和复制到输出目录。 我尝试重新启动我的计算机,只是VI ...
eRROR在Oracle SQL开发人员扩展中创建连接vscode
试图添加连接 它给出了此错误: 错误:尝试连接到数据库时发生错误。发生以下错误:ORA-12541:无法连接。主持人没有听众...
在使用XLClang ++的__cxa_end_catch中查看崩溃的一部分,我尝试对复制器进行重构以避免使用std :: exception_ptr,以查看是否会影响任何东西: #include 在使用XLClang ++__cxa_end_catch中研究carlash的一部分,我尝试重构复制器以避免使用std::exception_ptr,以查看是否会影响任何东西: #include <cstdio> #include <exception> #include <future> #include <thread> #include <vector> std::future<std::invalid_argument> GetExceptionFromDeadThread() { return std::async(std::launch::async, []() { try { throw std::invalid_argument("Some string long enough to allocate on the heap? "); } catch (std::invalid_argument e) { return e; } catch (...) { std::fprintf(stderr, "'std::rethrow_exception(future.get())' threw unexpected exception"); abort(); } }); } int main() { try { constexpr size_t numThreads(100); std::vector<std::future<std::invalid_argument>> futures; while (true) { for (size_t i = 0; i < numThreads; ++i) { futures.push_back(GetExceptionFromDeadThread()); } while (!futures.empty()) { auto& future(futures.back()); future.wait(); try { throw future.get(); } catch (std::invalid_argument&) { std::fputs(".", stdout); } catch (...) { std::fprintf(stderr, "'std::rethrow_exception(future.get())' threw unexpected exception"); abort(); } futures.pop_back(); } } } catch (...) { std::fprintf(stderr, "Caught unexpected exception"); abort(); } } 但我注意到,在Windows开发机上进行测试时(W/ Visual Studio 2022,在调试中默认创建的C ++控制台项目| X64配置),它正在崩溃!当我以为我正在研究AIX编译器/工具链的问题时,这打扰了我,但也许我做错了什么? Heap[exception_ptr_test.exe]:指定为无效的地址 rtlvalidateHeap(0000021A37BB0000,00007FFFDA43A2F0) > ntdll.dll!RtlpBreakPointHeap() Unknown ntdll.dll!RtlpValidateHeapEntry() Unknown ntdll.dll!RtlValidateHeap() Unknown KernelBase.dll!HeapValidate() Unknown ucrtbased.dll!_CrtIsValidHeapPointer(const void * block) Line 1407 C++ ucrtbased.dll!free_dbg_nolock(void * const block, const int block_use) Line 904 C++ ucrtbased.dll!_free_dbg(void * block, int block_use) Line 1030 C++ ucrtbased.dll!free(void * block) Line 32 C++ vcruntime140d.dll!__std_exception_destroy(__std_exception_data * data) Line 46 C++ exception_ptr_test.exe!std::exception::~exception() Line 91 C++ exception_ptr_test.exe!std::logic_error::~logic_error() C++ exception_ptr_test.exe!std::invalid_argument::~invalid_argument() C++ exception_ptr_test.exe!std::_Packaged_state<std::invalid_argument __cdecl(void)>::_Call_immediate() Line 494 C++ exception_ptr_test.exe!std::_Task_async_state<std::invalid_argument>::{ctor}::__l2::<lambda_1>::operator()() Line 664 C++ exception_ptr_test.exe!std::invoke<`std::_Task_async_state<std::invalid_argument>::_Task_async_state<std::invalid_argument><std::_Fake_no_copy_callable_adapter<`GetExceptionFromDeadThread'::`2'::<lambda_1>>>'::`2'::<lambda_1> &>(std::_Task_async_state<std::invalid_argument>::{ctor}::__l2::<lambda_1> & _Obj) Line 1695 C++ exception_ptr_test.exe!std::_Func_impl_no_alloc<`std::_Task_async_state<std::invalid_argument>::_Task_async_state<std::invalid_argument><std::_Fake_no_copy_callable_adapter<`GetExceptionFromDeadThread'::`2'::<lambda_1>>>'::`2'::<lambda_1>,void>::_Do_call() Line 874 C++ exception_ptr_test.exe!std::_Func_class<void>::operator()() Line 920 C++ exception_ptr_test.exe!Concurrency::details::_MakeVoidToUnitFunc::__l2::<lambda_1>::operator()() Line 2363 C++ exception_ptr_test.exe!std::invoke<`Concurrency::details::_MakeVoidToUnitFunc'::`2'::<lambda_1> &>(Concurrency::details::_MakeVoidToUnitFunc::__l2::<lambda_1> & _Obj) Line 1696 C++ exception_ptr_test.exe!std::_Func_impl_no_alloc<`Concurrency::details::_MakeVoidToUnitFunc'::`2'::<lambda_1>,unsigned char>::_Do_call() Line 878 C++ exception_ptr_test.exe!std::_Func_class<unsigned char>::operator()() Line 921 C++ exception_ptr_test.exe!Concurrency::task<unsigned char>::_InitialTaskHandle<void,`std::_Task_async_state<std::invalid_argument>::_Task_async_state<std::invalid_argument><std::_Fake_no_copy_callable_adapter<`GetExceptionFromDeadThread'::`2'::<lambda_1>>>'::`2'::<lambda_1>,Concurrency::details::_TypeSelectorNoAsync>::_LogWorkItemAndInvokeUserLambda<std::function<unsigned char __cdecl(void)>>(std::function<unsigned char __cdecl(void)> _func) Line 3528 C++ exception_ptr_test.exe!Concurrency::task<unsigned char>::_InitialTaskHandle<void,`std::_Task_async_state<std::invalid_argument>::_Task_async_state<std::invalid_argument><std::_Fake_no_copy_callable_adapter<`GetExceptionFromDeadThread'::`2'::<lambda_1>>>'::`2'::<lambda_1>,Concurrency::details::_TypeSelectorNoAsync>::_Init(Concurrency::details::_TypeSelectorNoAsync __formal) Line 3548 C++ exception_ptr_test.exe!Concurrency::task<unsigned char>::_InitialTaskHandle<void,`std::_Task_async_state<std::invalid_argument>::_Task_async_state<std::invalid_argument><std::_Fake_no_copy_callable_adapter<`GetExceptionFromDeadThread'::`2'::<lambda_1>>>'::`2'::<lambda_1>,Concurrency::details::_TypeSelectorNoAsync>::_Perform() Line 3533 C++ exception_ptr_test.exe!Concurrency::details::_PPLTaskHandle<unsigned char,Concurrency::task<unsigned char>::_InitialTaskHandle<void,`std::_Task_async_state<std::invalid_argument>::_Task_async_state<std::invalid_argument><std::_Fake_no_copy_callable_adapter<`GetExceptionFromDeadThread'::`2'::<lambda_1>>>'::`2'::<lambda_1>,Concurrency::details::_TypeSelectorNoAsync>,Concurrency::details::_TaskProcHandle>::invoke() Line 1475 C++ exception_ptr_test.exe!Concurrency::details::_TaskProcHandle::_RunChoreBridge(void * _Parameter) Line 171 C++ exception_ptr_test.exe!Concurrency::details::_DefaultPPLTaskScheduler::_PPLTaskChore::_Callback(void * _Args) Line 57 C++ msvcp140d.dll!Concurrency::details::`anonymous namespace'::_Task_scheduler_callback(_TP_CALLBACK_INSTANCE * _Pci, void * _Args, _TP_WORK * __formal) Line 134 C++ ntdll.dll!TppWorkpExecuteCallback() Unknown ntdll.dll!TppWorkerThread() Unknown kernel32.dll!BaseThreadInitThunk() Unknown ntdll.dll!RtlUserThreadStart() Unknown ,此外,更改为return e使崩溃消失了。 您“手动”捕获,然后按值返回一个异常对象(后来恢复返回对象)。这很容易导致双重破坏或其他细微的终身问题,尤其是如果将异常消息存储在堆分配的缓冲区中时。换句话说,您的额外应支付会导致调试CRT正确地抱怨无效的指针或指针免费。 在您的代码中,您有: return std::invalid_argument(e)按值(std :: Invalid_argument e)进行启动迫使异常对象的副本。然后,您继续前进,这是另一个副本,最终在主线程中进行std::invalid_argument。这是相同异常对象弹跳的多个副本。一些标准的图书馆实现很小的剂量可以很好,但这通常是一个坏习惯,在您的代码中,它基本上是复制一个包含大型,动态分配的字符串的例外。 Instead,尝试: catch (std::invalid_argument e) { return e; } 至少在阻止捕获块中不必要的副本。 您也可以使用return e;重新捕获您捕获的例外:throw future.get(); 对比,catch (const std::invalid_argument& e) { return e; } 总是抛出一个e。如果您的目标是保留原始异常对象(及其所有内部状态),请不要完全命名变量:只需使用throw; . 其他选项是,您也可以在same中手动存储异常,还可以利用catch (...) { // ... throw; // rethrow the same exception object } 或让throw e;做到。 在引擎盖下,copy已经能够捕获异步功能中抛出的任何例外,并将其存储为throw;。如果您希望主线程看到该异常,只需让异步函数正常投掷,当您在主线程中执行std::future时,如果异步代码会引发异常,则std::exception::ptr调用它。例如: STD:: Future GetExceptionFromDeadThread() { 返回std :: async(std ::启动:: async,[] { 投掷std :: invalid_argument(“一些字符串...”); }); }std::async结论,始终通过引用(std::async)捕获异常。如果您需要重新固定完全相同的例外,请使用std::exception::ptr而不是future.get()。重要的是,如果您可以利用get()的正常机制或int main() { auto fut = GetExceptionFromDeadThread(); try { fut.get(); } catch(const std::invalid_argument &e) { // handle } // ... } 。