Имя файла WOPI со специальными символами не открывает файл в онлайн-редакторе - PullRequest
4 голосов
/ 26 апреля 2019

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

Пример:

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

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

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

1 Ответ

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

Проблема в том, что параметры атрибута маршрута не будут принимать зарезервированные символы, ДАЖЕ , когда они закодированы в URL:

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

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

https://localhost:44349/files/?fileName=mydocument%2B%23%26.docx&access_token=test-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";

}

enter image description here

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

Исключенные символы 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/, где символ '@' имеет особое значение.

Источник:

https://stackoverflow.com/a/13500078/3850405

...