Имя файла WOPI со специальными символами не открывает файл в онлайн-редакторе

Существует клиент и хост WOPI, которые настроены исключительно для одного из веб-приложений, и онлайн-редактор работает гладко, когда имя файла правильное без каких-либо зарезервированных символов URL, но когда имя файла содержит +,#,& подписывает протокол WOPI маршруты обрабатывают эти символы как разделители и выдают ошибку 404, поскольку маршрут не будет доступен для конечных точек GetFile, GetFileInfo.

Пример:

        [Route("files/{fileName}/")]
        [HttpGet]
        public async Task<FileInfoBE> GetFileInfo(string fileName, string access_token)
        { //Logic here }

В приведенном выше вызове конечной точки, если имя файла содержит знак плюс (+) и если вызов к этой конечной точке кодирован по URL-адресу, знак плюс будет преобразован в%2b, в идеале он должен попасть в конечную точку, но до того, как вызов будет выполнен webclient% 2b преобразуется в знак + и выдает ошибку 404.

Примечание. Пользовательское кодирование не помогает, поскольку сервер OWA взаимодействует со службой WOPI.

1 ответ

Проблема в том, что параметры атрибута маршрута не будут принимать никаких зарезервированных символов, даже если они закодированы в URL:

https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

Это будет работать:

https: // локальный: 44349 / файлы / имя_файл = mydocument% 2B% 23% 26.docx & access_token = тест-маркер

[Route("files/")]
[HttpGet]
public async Task<string> GetFileInfo2(string fileName, string access_token)
{
    return "Test";
}

Это не сработает:

https://localhost:44349/files/mydocument%2B%23%26.docx?access_token=test-token

[Route("files/{fileName}/")]
[HttpGet]
public async Task<string> GetFileInfo(string fileName, string access_token)
{
    return "Test";
}

Завершите пример от внешнего интерфейса Javascript до внутреннего интерфейса C# с помощью вызова прокси-сервера WebClient:

Javascript:

let fileName = encodeURIComponent('mydocument+#&.docx');
fetch(`files?fileName=${fileName}&access_token=test-token`)
    .then(function (response) {
        return response.json();
    })
    .then(function (myJson) {
        console.log(JSON.stringify(myJson));
    });

C#:

[Route("files/")]
[HttpGet]
public async Task<string> GetFileInfo(string fileName, string access_token)
{
    using (WebClient client = new WebClient())
    {
        var host = $"{HttpContext.Current.Request.Url.Scheme}://{HttpContext.Current.Request.Url.Host}:{HttpContext.Current.Request.Url.Port}";

        var data = client.DownloadString($"{host}/proxy/files/?fileName={HttpUtility.UrlEncode(fileName)}&access_token={HttpUtility.UrlEncode(access_token)}");

        return data;
    }
}

[AllowAnonymous]
[Route("proxy/files/")]
[HttpGet]
public async Task<string> ProxyGetFileInfo(string fileName, string access_token)
{
    return "MyValues";

}

Почему эти символы запрещены и почему их нужно обрабатывать в первую очередь:

Исключенные символы US-ASCII, запрещенные в синтаксисе URI:

   control     = <US-ASCII coded characters 00-1F and 7F hexadecimal>
   space       = <US-ASCII coded character 20 hexadecimal>
   delims      = "<" | ">" | "#" | "%" | <">

Символ "#" исключен, поскольку он используется для отделения URI от идентификатора фрагмента. Символ процента "%" исключен, поскольку он используется для кодирования экранированных символов. Другими словами, "#" и "%" являются зарезервированными символами, которые должны использоваться в определенном контексте.

Список неразумных символов разрешен, но может вызвать проблемы:

   unwise      = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`"

Символы, которые зарезервированы в компоненте запроса и / или имеют специальное значение в URI/URL:

  reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","

Вышеуказанный "зарезервированный" синтаксический класс относится к тем символам, которые разрешены в URI, но которые не могут быть разрешены в конкретном компоненте общего синтаксиса URI. Символы в "зарезервированном" наборе не зарезервированы во всех контекстах. Например, имя хоста может содержать необязательное имя пользователя, поэтому это может быть что-то вроде ftp://user@hostname/ где символ "@" имеет особое значение.

Источник:

/questions/16869761/kakie-simvolyi-delayut-url-nedejstvitelnyim/16869771#16869771

Другие вопросы по тегам