HttpContext.Current null в WebContentTypeMapper / GetMessageFormatForContentType - PullRequest
0 голосов
/ 08 ноября 2019

Я хочу написать WebContentTypeMapper, который возвращает WebContentFormat зависимость от пути uri.

До сих пор я использовал HttpContext.Current.Request.PathInfo. Но если есть большие POST-запросы с телом более 64 КБ, то HttpContext.Current равно нулю.

Я обнаружил, что HttpContext.Current не предназначен для использования там. Но он работает во всех других случаях, когда запрос имеет небольшой размер кб.

Есть ли другой способ узнать путь текущего запроса в GetMessageFormatForContentType()?

public class RawContentTypeMapper : WebContentTypeMapper
{
    public override WebContentFormat GetMessageFormatForContentType(string contentType)
    {
        string pathInfo;
        try
        {
            pathInfo = HttpContext.Current.Request.PathInfo;
        }
        catch (NullReferenceException e)
        {
            // This happens for large POST requests
            pathInfo = ...please help!
        }
        switch (pathInfo)
        {
            case "/abc/path1":
            case "/abc/path2":
                return WebContentFormat.Raw;
            default:
                return WebContentFormat.Default; // No change to default behavior
        }
    }
}

1 Ответ

0 голосов
/ 12 ноября 2019

У меня есть решение сейчас. Состоит из нескольких изменений:

Я изменил RawContentTypeMapper, чтобы всегда возвращать WebContentFormat.Raw

Web.config:

  • Добавлена ​​копия привязки, которая использует RawContentTypeMapper и удален атрибут contentTypeMapper. Поэтому он использует сопоставление по умолчанию.

  • Добавлена ​​конечная точка для каждого адреса («abc / path1» ...) с привязкой, которая использует RawContentTypeMapper.

  • Добавлена ​​конечная точка к базовому адресу «abc» с привязкой по умолчанию.

IMySourceCode.cs: и MySourceCode.cs:

Сделано новое OperationContract с UriTemplate = "". Там я проверяю HttpContext.Current.Request.PathInfo для «abc / path1 /», «abc / path2 /» ... и вызываю оригинальные методы OperationContract.

Для этого все OperationContracts должны иметь одинаковую подпись (здесь void MyMethod(Потоковые данные)).

Добавлено Global.asax для перезаписи пути "abc / path1" в "abc / path1 /"...:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var pathInfo = HttpContext.Current.Request.PathInfo.ToLowerInvariant();
        if (pathInfo.StartsWith("/abc/"))
        {
            foreach (var s in new[] { "/abc/path1", "/abc/path2" })
            {
                if (pathInfo == s)
                {
                    var rawUrl = HttpContext.Current.Request.RawUrl.ToLower(CultureInfo.InvariantCulture);
                    HttpContext.Current.RewritePath($"{rawUrl}/");
                    break;
                }
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...