gpt4 book ai didi

c# - 带有特殊字符的 WOPI 文件名无法在在线编辑器中打开文件

转载 作者:行者123 更新时间:2023-11-30 12:38:07 26 4
gpt4 key购买 nike

有一个专门为其中一个 Web 应用程序设置的 WOPI 客户端和主机,当文件名正确且没有任何 URL 保留字符但当文件名包含 +、#、& 时,在线编辑器可以正常工作标志 WOPI 协议(protocol)路由将这些字符视为分隔符并提供 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 服务交互。

最佳答案

问题是路由属性参数不接受任何保留字符,甚至当它们是 URL 编码时:

https://learn.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";
}

使用 WebClient 代理调用从 Javascript 前端到 C# 后端的完整示例:

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

为什么不允许使用这些字符以及为什么首先需要处理它:

URI 语法中不允许使用的排除的 US-ASCII 字符:

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

字符“#”被排除在外,因为它用于将 URI 与片段标识符分隔开。百分号“%”被排除在外,因为它用于转义字符的编码。换句话说,“#”和“%”是必须在特定上下文中使用的保留字符。

不明智的字符列表是允许的,但可能会导致问题:

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

reserved 的字符在查询组件中和/或在 URI/URL 中具有特殊含义:

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

上面的“保留”语法类别指的是 URI 中允许使用的字符,但在通用 URI 语法的特定组件中可能不允许使用这些字符。 “保留”集中的字符并非在所有上下文中都保留。例如,主机名可以包含一个可选的用户名,因此它可以类似于 ftp://user@hostname/,其中“@”字符具有特殊含义。

来源:

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

关于c# - 带有特殊字符的 WOPI 文件名无法在在线编辑器中打开文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55866064/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com