【问题标题】:asp.net core 5 Request.Schema Not Recognizing correct namespaceasp.net core 5 Request.Schema 无法识别正确的命名空间
【发布时间】:2021-04-28 08:50:53
【问题描述】:

我使用以下代码生成电子邮件身份验证链接(用户应单击该链接,如果有效,该帐户将被激活)。以下代码将在控制器中正常工作,但我重构了代码并将其移至 Service 类。 Request.Schema 无法识别正确的命名空间。我尝试了几种方法和软件包,但它不起作用。怎么解决?

用途:

using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
//using Microsoft.AspNetCore.Mvc;
using ProjectName.Core.DTOs.ClientDTOs;
using ProjectName.Core.Services.Interfaces;
using ProjectName.Core.Utilities;
using ProjectName.DataLayer.Context;
using ProjectName.DataLayer.Entities.PublicEntities;
using ProjectName.DataLayer.Entities.UserEntities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//using System.Web.Mvc;
using System.Threading.Tasks;

我关注了这个document on microsoft,但仍然没有工作......

网址.操作

var address = Microsoft.AspNetCore.Mvc.IUrlHelper.Action(
    "ConfirmEmail",
    "Account",
    new { username = newUser.UserName, token = emailConfirmationToken },
    **Request.Scheme**);

【问题讨论】:

  • 嗨@Ahmad yazdany,我的回答是否帮助您解决了您的问题?如果可以,请您接受作为答案吗?如果没有,请您跟进让我知道吗?参考:@987654322 @.谢谢。

标签: c# asp.net .net asp.net-mvc asp.net-core


【解决方案1】:

首先创建一个用于编码 url 和令牌的类。

        public class TokenUrlEncoderService
        {
            public string EncodeToken(string token)
            {
                return WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(token));
            }
            public string DecodeToken(string urlToken)
            {
                return Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(urlToken));
            }
        }

然后像这样在您的服务层中创建一个类。

 public class IdentityEmailService
        {
            public IdentityEmailService(IEmailSender sender,
                                        UserManager<IdentityUser> userMgr,
                                        IHttpContextAccessor contextAccessor,
                                        LinkGenerator generator,
                                        TokenUrlEncoderService encoder)
            {
                EmailSender = sender;
                UserManager = userMgr;
                ContextAccessor = contextAccessor;
                LinkGenerator = generator;
                TokenEncoder = encoder;
            }
            public IEmailSender EmailSender { get; set; }
            public UserManager<IdentityUser> UserManager { get; set; }
            public IHttpContextAccessor ContextAccessor { get; set; }
            public LinkGenerator LinkGenerator { get; set; }
            public TokenUrlEncoderService TokenEncoder { get; set; }
            private string GetUrl(string emailAddress, string token, string page)
            {
                string safeToken = TokenEncoder.EncodeToken(token);
                return LinkGenerator.GetUriByPage(ContextAccessor.HttpContext, page,
                null, new { email = emailAddress, token = safeToken });
            }
        }

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-5.0#use-httpcontext-from-custom-components

【讨论】:

    【解决方案2】:

    以下代码可以在控制器中正常工作,但我重构了代码并将其移至服务类。

    Request这里是ControllerBase类中的属性,你的服务类必须继承自ControllerBase或Controller。

    如下更改您的代码:

    public interface IGenerateUrl
    {
        string GetUrl();
    }
    public class GernateUrl : IGenerateUrl
    {
        private readonly IUrlHelper url;
        public GernateUrl(IUrlHelper url)
        {
            this.url = url;
        }
        public string GetUrl()
        {
            string scheme = url.ActionContext.HttpContext.Request.Scheme;
            var address = url.Action(
            "ConfirmEmail",
            "Account",
            new { username = "user", token = "token" },
            scheme);
            return address;
        }
    }
    

    请务必注册如下服务:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
    
        services.AddScoped<IGenerateUrl, GernateUrl>();
    
        services.AddScoped<IUrlHelper>(x =>
        {
            var actionContext = x.GetRequiredService<IActionContextAccessor>().ActionContext;
            var factory = x.GetRequiredService<IUrlHelperFactory>();
            return factory.GetUrlHelper(actionContext);
        });
        services.AddControllersWithViews();        
    }
    

    【讨论】:

      猜你喜欢
      • 2016-05-21
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      • 2019-12-27
      • 2019-12-19
      • 2012-05-07
      • 2018-03-21
      • 1970-01-01
      相关资源
      最近更新 更多