覆盖扩展方法C#
我正在使用RestSharp创建对Web服务的http请求。其中一个参数length的运行时间非常长,大于100k个字符,因此我想我需要使用POST方法(因为GET对查询字符串长度的限制)。然而,当我尝试这样做时,我得到了一个异常,uri太长。我下载了他们的源代码来找出原因。请看下面的代码:覆盖扩展方法C#,c#,extension-methods,restsharp,C#,Extension Methods,Restsharp,我正在使用RestSharp创建对Web服务的http请求。其中一个参数length的运行时间非常长,大于100k个字符,因此我想我需要使用POST方法(因为GET对查询字符串长度的限制)。然而,当我尝试这样做时,我得到了一个异常,uri太长。我下载了他们的源代码来找出原因。请看下面的代码: querystring.AppendFormat("{0}={1}", p.Name.UrlEncode(), p.Value.UrlEncode()); 现在UrlEncode()方法是StringEx
querystring.AppendFormat("{0}={1}", p.Name.UrlEncode(), p.Value.UrlEncode());
现在UrlEncode()方法是StringExtensions.cs类中可用的扩展方法,其实现如下:
public static string UrlEncode(this string input)
{
return Uri.EscapeDataString(input);
}
问题是Uri.EscapeDataString无法处理超过65519个字符的字符串(请参阅post-)
如果UrlEncode扩展方法是这样实现的,那么我的问题就可以解决了
public static string UrlEncode(this string input)
{
int limit = 65520;
StringBuilder sb = new StringBuilder();
int loops = input.Length / limit;
for (int i = 0; i <= loops; i++)
{
if (i < loops)
{
sb.Append(Uri.EscapeDataString(input.Substring(limit * i, limit)));
}
else
{
sb.Append(Uri.EscapeDataString(input.Substring(limit * i)));
}
}
return sb.ToString();
}
公共静态字符串UrlEncode(此字符串输入)
{
整数极限=65520;
StringBuilder sb=新的StringBuilder();
int循环=输入。长度/限制;
对于(int i=0;i一种解决方案是使用扩展现有的Uri类-您应该继承现有的Uri类,然后使用new运算符重写所需的方法。这样,您将在不修改原始代码的情况下更改默认行为。代码示例:
public class A
{
public int Get1()
{
return 1;
}
public int Get2()
{
return 100;
}
}
public class B : A
{
// override A's Get1
public new int Get1()
{
return 2;
}
}
以及调用的输出:
var b = new B();
System.Console.WriteLine(string.Format("{0} - {1}", b.Get1(), b.Get2()));
将是:
2 - 100
而不是1-100
希望这有帮助
问候,,
P.谢天谢地,据我所知,没有办法。扩展方法
s.UrlEncode()
基本上是对
StringExtensions.UrlEncode(s);
由于此方法是静态的,因此无法“重写”它。此外,它在编译时绑定到该方法,因此无法在运行时将其重定向到其他方法
这也是不允许的。如果允许,您可以创建一个“覆盖”来格式化您的C驱动器
如果要使用不同的版本,可以使用不同的名称创建新的扩展方法,或者找到缩短参数长度的方法。:)查看如何使用RestSharp执行POST
。有效负载放在消息正文中,而不是查询字符串中。唯一的问题是,如果第三方决定将其向下转换为Uri
(或者如果它被传递到任何采用Uri
的代码中,包括Uri
中可能利用它的任何方法)然后调用原始的UrlEncode
方法。如果您将有效负载附加到查询字符串以执行POST,那么您就做错了……我不能说这是否是正确的方法,但这是OSS,因此您可以始终更改源代码并发出拉取请求。至少,您可以始终创建CU汤姆版本