【问题标题】:Backslash not recognized as param in WebGet反斜杠在 WebGet 中未被识别为参数
【发布时间】:2019-10-22 19:46:56
【问题描述】:

代码:

[OperationContract]
[WebGet(UriTemplate = "ProgrammerData/Document/{*documentName}")]
string ProgrammerDataDocument(string documentName);

呼叫:

图片文字:localhost/RedactedPath/ProgrammerData/Document/%5C%5Cxundas

结果

图片文字:

public string ProgrammerDataDocument(string documentName)
{
  // value of documentName at this point is "xundas"
  string a = "";
  return a;
}

我编码但没有出现在我的参数中的反斜杠。

我需要这个,因为我将网络路径从客户端发送到服务器

【问题讨论】:

标签: c# .net wcf


【解决方案1】:

起初,当我们将反斜杠传递给服务器时,浏览器不支持反斜杠。任何反斜杠都将转换为正斜杠。因此这是不可能实现的。
此外,参数前面的正斜杠和反斜杠均不被识别(尚未加密),但参数中间的斜杠被识别并自动转换为反斜杠。最后,当返回结果时,Url 支持正斜杠。请考虑以下代码。

[OperationContract]
        [WebGet(UriTemplate ="abc/{*value}")]
        string GetData(string value);


    public string GetData(string value)
            {
                var result = System.Net.WebUtility.UrlDecode(value);
                result = result.Replace("/", @"\\");
                return result;
            }

结果。

关于 UriTemplate。
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/uritemplate-and-uritemplatetable?redirectedfrom=MSDN
如果有什么可以帮助的,请随时告诉我。

【讨论】:

    【解决方案2】:

    URL 的资源名称中不允许使用反斜杠(浏览器只需将它们转换为正斜杠);它们只允许作为查询参数的编码值。

    我建议在你的路径中分支出域部分和名称部分,例如

    [OperationContract]
    [WebGet(UriTemplate = "ProgrammerData/Document/{docDomain}{docName}")]
    string ProgrammerDataDocument(string docDomain, string docName);
    

    您可能希望在域/UNC 部分(它是空的,所以基本上是.,即您的示例中的local)和从层次结构的角度来看有意义的文档名称之间添加一个斜杠作为分隔符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 2011-05-26
      • 2013-04-14
      • 1970-01-01
      • 2023-03-25
      • 2016-09-11
      相关资源
      最近更新 更多