Как извлечь заголовки запроса и передать их в бизнес-логику в случае asp.net core 2 graphql endpoint? - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть следующий фрагмент кода, разработанный с использованием asp.net web api 2 и EntityFramework 6.

public class TestController : BaseApiController
{
    private readonly ITestService _testService;
    private readonly ICommonService _commonService;
    private readonly IImageService _imageService;
    public TestController(ITestService testService, ICommonService commonService, IImageService imageService)
    {
        _testService = testService;
        _commonService = commonService;
        _imageService = imageService;
    }

    [Route("test")]
    public IHttpActionResult Get()
    {
        var resp = _testService.GetDetailsForLocation(locale);
        return Ok(resp);
    }
}

public class BaseApiController : ApiController
{
    public string locale
    {
        get
        {
            if (Request.Headers.Contains("Accept-Language"))
            {
                return Request.Headers.GetValues("Accept-Language").First();
            }
            else
            {
                return string.Empty;
            }
        }
    }

    public string GetCookieId()
    {
        string value = string.Empty;
        IEnumerable<CookieHeaderValue> cookies = this.Request.Headers.GetCookies("mycookie");
        if (cookies.Any())
        {
            IEnumerable<CookieState> cookie = cookies.First().Cookies;
            if (cookie.Any())
            {
                var cookieValue = cookie.FirstOrDefault(x => x.Name == "mycookie");
                if (cookieValue != null)
                    value = cookieValue.Value.ToLower();
            }
        }

        return value;
    }
}

Я конвертирую существующую конечную точку restpi в конечную точку graphql, используя asp.net core 2 и graphql.net. В приведенном ниже методе в настоящее время я отправляю «en» в качестве значения, но я хочу передать значение локали, как это было сделано в случае asp.net web api 2 в вышеприведенной реализации.

Здесь я хотел бы узнать, каков наилучший способ прочитать заголовки запроса и передать значение в бизнес-код (т. Е. В данном случае в метод: GetDetailsForLocation ("en")

public class TestQuery : ObjectGraphType<object>
{
    public TestQuery(ITestService testService)
    {
        Field<TestResultType>("result", resolve: context => testService.GetDetailsForLocation("en"), description: "Test data");
    }
}

Может ли кто-нибудь помочь мне дать рекомендации по решению проблемы?

1 Ответ

0 голосов
/ 08 ноября 2018

Самый простой маршрут - использовать IHttpContextAccessor. Зарегистрируйте IHttpContextAccessor как синглтон.

https://adamstorr.azurewebsites.net/blog/are-you-registering-ihttpcontextaccessor-correctly

В StartUp.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

Класс GraphQL:

public class TestQuery : ObjectGraphType<object>
{
    public TestQuery(ITestService testService, IHttpContextAccessor accessor)
    {
        Field<TestResultType>(
            "result",
            description: "Test data",
            resolve: context => testService.GetDetailsForLocation(accessor.HttpContext...)
        );
    }
}
...