HttpContext не может быть указан в поддержке вызова метода - PullRequest
0 голосов
/ 29 апреля 2019

Мне нужно использовать два этапа в нескольких местах на моем веб-сайте .NET Core.Я решил реализовать интерфейс и поддерживающий класс в моем Startup.cs, чтобы я мог использовать DI для вставки объекта в мой PageModel на различных страницах Razor в моем проекте.

Startup.cs

services.AddSingleton<IAuthenticatedGraphClient, AuthenticatedGraphClient>();

Интерфейс:

public interface IAuthenticatedGraphClient
{
    Task<GraphServiceClient> GetAuthenticatedGraphClientAsync(HttpContext httpContext);
}    

Реализация класса:

public class AuthenticatedGraphClient : IAuthenticatedGraphClient
{
    private ITokenAcquisition tokenAcquisition;

    public AuthenticatedGraphClient(ITokenAcquisition tokenAcquisition)
    {
        this.tokenAcquisition = tokenAcquisition;
    }

    public async Task<GraphServiceClient> GetAuthenticatedGraphClientAsync(HttpContext httpContext)
    {
        var accessToken = await TokenAcquisition.GetAccessTokenOnBehalfOfUser(httpContext, new[] { ScopeConstants.ScopeUserRead });

        return new GraphServiceClient(new DelegateAuthenticationProvider((requestMessage) => {
            requestMessage
                .Headers
                .Authorization = new AuthenticationHeaderValue("bearer", accessToken);
            return Task.FromResult(0);
        }));
    }
}

PageModel:

public class TestPageModel : PageModel
{
    private IAuthenticatedGraphClient graphClient;

    public TestPage(IAuthenticatedGraphClient graphClient)
    {
        this.graphClient = graphClient;
    }

    public async Task OnPostAsync()
    {
        var graphServiceClient = await graphClient.GetAuthenticatedGraphClientAsync(HttpContext);
        //truncated for brevity...
    }
}

Я думал, что должен предоставить HttpContextиз класса PageModel в вызываемый метод, но я не совсем уверен, так как это дает мне ошибку:

Ссылка на объект требуется для нестатического поля, метода или свойства 'TokenAcquisition.GetAccessTokenOnBehalfOfUser (HttpContext, IEnumerable, string) '

Я также пытался:

var accessToken = await TokenAcquisition.GetAccessTokenOnBehalfOfUser(HttpContext, new[] { ScopeConstants.ScopeUserRead });

... однако это дает мне ошибку:

'HttpContext' - это тип, который недопустим в данном контексте

Если я добавлю GetAuthenticatedGraphClientAsync как метод в тот же класс PageModel, он будет работать без проблем иHttpContext понятно.

Есть идеи?Есть ли лучший шаблон?

1 Ответ

1 голос
/ 29 апреля 2019

Ваша первая ошибка, связанная с необходимостью ссылки на объект, может показаться из-за того, что ваш конструктор AuthenticatedGraphClient принимает параметр ITokenAcquisition, который, по-видимому, не передается в Startup.cs

Что касается вашей второй ошибки о том, что HttpContext является типом, это правда, я вполне уверен, что вы должны передать HttpContext.Current в GetAccessTokenOnBehalfOfUser.

РЕДАКТИРОВАТЬ: Кроме того, вы даже не используетепереданное в ITokenAcquisition.

var accessToken = await TokenAcquisition.GetAccessTokenOnBehalfOfUser(httpContext, new[] { ScopeConstants.ScopeUserRead });

должно быть:

var accessToken = await tokenAcquisition.GetAccessTokenOnBehalfOfUser(httpContext, new[] { ScopeConstants.ScopeUserRead });

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...