Имя файла 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:
Это будет работать:
[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