httpclient 和 WCF 中的井号标签 (#) 字符问题

问题描述 投票:0回答:2

我在使用 httpClient 和 WCF 时遇到问题,特别是当我将主题标签 (#) 作为输入时。 下面是我的代码:

对于 WCF:

[OperationContract]
[WebGet( RequestFormat = WebMessageFormat.Json, UriTemplate = "/GetCase/{*id}" )]
string[] GetCase( string id );

在客户端:

HttpClientHandler handler = new HttpClientHandler();
handler.UseProxy = false;
HttpClient client = new HttpClient(handler);
string link = string.Format("https://{0}:{1}/", host, port);
Uri url = new Uri(link);
System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
client.BaseAddress = new Uri(link);
string serviceName = "Service";
string restPart = "rest";
string method = "GetCase";
string valueToSearch = Uri.EscapeDataString("TEST#12345");
string completeLinkWithMethod = link + serviceName + "/" + restPart + "/" + method;
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

var response = await client.GetAsync(completeLinkWithMethod + "/" + valueToSearch);

当我拨打电话时,在客户端上我看到

valueToSearch
是“TEST%2312345”,但是当我进入服务器时,id 值为“TEST

有没有办法传递所有字符串而不被截断?

当我拨打电话时,在客户端上我看到 valueToSearch 是“TEST%2312345”,但是当我进入服务器时,id 值为“TEST

有没有办法传递所有字符串而不被截断?

c# wcf dotnet-httpclient
2个回答
0
投票

据我所知,大多数堆栈(包括.net)不会将片段(#)发送到服务器,它们只是客户端的事情。

https://en.wikipedia.org/wiki/URI_fragment#:~:text=当%20an%20agent%20(比如%20as,%20不%20发送%20%20片段。

要解决此问题,您需要将片段中所需的任何内容复制或移动到发送到服务器的内容中。例如查询字符串。


0
投票

克服此限制的一种方法是在两侧执行自定义字符串编码。例如:

var encodedHashtag = $"U+{Char.ConvertToUtf32("""#""", 0)}";
var valueToSearch = "TEST#12345".Replace("#", encodedHashtag);

var encodedHashtag = $"U+{Char.ConvertToUtf32("""#""", 0)}";
var decodedId = id.Replace(encodedHashtag, "#");

请记住,如果用户输入包含

U+35
的案例 ID,则此方法将无法按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.