我正在使用RestSharp为Web服务创建http请求。其中一个参数长度是非常长的> 100 K字符,所以我想我需要使用POST方法(因为GET查询字符串的长度有限)。但是,当我尝试这样做时,我得到一个例外,即uri太长了。我下载了他们的源代码以找出原因。看看下面的代码:
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 Uri.EscapeDataString() - Invalid URI: The Uri string is too long)
如果像这样实现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()时,它会忽略它自己的扩展方法,而是调用我的扩展方法?
非常感谢任何帮助。感谢。
答案 0 :(得分:3)
谢天谢地,我不知道。
的扩展方法s.UrlEncode()
基本上是语法糖
StringExtensions.UrlEncode(s);
由于此方法是静态的,因此无法“覆盖”它。此外,它在编译时被绑定到该方法,因此在运行时无法将其重定向到其他方法。
也不应该被允许。如果是,你可以创建一个“覆盖”它来格式化你的C盘!。
如果您想使用其他版本,可以使用其他名称创建新的扩展方法,或找出缩短参数长度的方法。 :)
答案 1 :(得分:1)
一种解决方案是使用hiding through inheritance扩展现有的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上。
答案 2 :(得分:1)
查看this answer,了解如何使用RestSharp执行POST
。有效负载位于消息正文中,而不是查询字符串中。