Свойства HttpRequestMessage в функции Azure - PullRequest
0 голосов
/ 09 ноября 2018

Когда мой веб-запрос выполняется, некоторые свойства, которые находятся в свойстве Properties HttpRequestMessage, относятся к пространству имен System.Web, хотя разрабатываемое мной приложение является функцией .NET Core 2 Azure.

Я хотел бы использовать один объект из коллекции, MS_HttpContext, который имеет тип System.Web.HttpContextWrapper. Можно ли использовать этот объект и как-то наложить его? Этот объект, кажется, из стандартного .NET Framework.

[FunctionName("Track")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "track")]HttpRequestMessage req, TraceWriter log, ExecutionContext context)
{
    // HttpContextWrapper is from System.Web, so this does not work
    var ctx = (HttpContextWrapper)req.Properties["MS_HttpContext"] 
}

РЕДАКТИРОВАТЬ: мой вопрос немного отличается от моего предыдущего вопроса ( Получить удаленный IP-адрес в функции Azure ), потому что он спрашивает, как можно получить доступ к классам из пространства имен System.Web из приложения .NET Core. Хотя я признаю, что желаемый результат одинаков в обоих вопросах, чтобы получить удаленный IP-адрес.

1 Ответ

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

Хорошо, не то чтобы я много знал, как это работает, но кажется, что отражение работает:

private static string GetRemoteIpAddress(HttpRequestMessage req)
{
    if (req.Properties.ContainsKey("MS_HttpContext") == false)
    {
        return null;
    }

    var httpContext = req.Properties["MS_HttpContext"];

    var pi = httpContext.GetType().GetProperty("Request");
    var request = pi.GetValue(httpContext);

    pi = request.GetType().GetProperty("UserHostAddress");
    var address = pi.GetValue(request);

    return address == null ? null : address.ToString();
}
...