2013-05-20 260 views
3

我正在使用RestSharp創建對web服務的http請求。其中一個參數長度超過100K字符,所以我想我需要使用POST方法(因爲GET的查詢字符串的長度限制)。但是,當我嘗試這樣做時,我得到了一個例外,那就是uri太長了。我下載了他們的源代碼來找出原因。看看下面的代碼:覆蓋擴展方法C#

querystring.AppendFormat("{0}={1}", p.Name.UrlEncode(), p.Value.UrlEncode()); 

現在以UrlEncode()方法是在StringExtensions.cs類中可用的擴展方法,它的實現是像這樣:

public static string UrlEncode(this string input) 
    { 
     return Uri.EscapeDataString(input); 
    } 

的問題是,烏里.EscapeDataString無法處理字符串超過65519個字符(看帖子 - Uri.EscapeDataString() - Invalid URI: The Uri string is too long

如果以UrlEncode擴展方法是這樣

012實現我的問題是可以解決的
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()時忽略它自己的擴展方法,而是調用我的擴展方法?

任何幫助,非常感謝。謝謝。

+1

如果您將有效載荷附加到查詢字符串以執行POST,那麼您做錯了... – arootbeer

+0

我不能說這是否是正確的方法,但這是OSS,因此您可以隨時對源進行更改並提出請求。至少,你可以創建一個自定義版本 –

回答

1

一個解決辦法是用hiding through inheritance擴展現有的Uri類 - 你應該繼承現有Uri類,然後用運營商所期望的方法來覆蓋。這樣你就可以在不修改原始代碼的情況下改變默認行爲。代碼示例:

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.

+3

唯一的問題是,如果第三方決定將它下傳到'Uri'(或者它被傳入需要'Uri'的_any_代碼,包括_any_方法在可能利用它的'Uri'內),則調用_original_'UrlEncode'方法。 –

3

值得慶幸的是,沒有辦法,我知道的。擴展方法s.UrlEncode()基本上是

StringExtensions.UrlEncode(s); 

語法糖由於這種方法是靜態的,沒有辦法爲「越權」了。此外,它在編譯時間綁定到該方法,所以在運行時無法將其重定向到其他方法。

它也不應該被允許。如果是這樣,你可以創建一個「覆蓋」它來格式化你的C盤!

如果您想使用不同的版本,您可以創建一個不同名稱的新擴展方法,或者找出縮短參數長度的方法。 :)

1

查看this answer查看如何使用RestSharp執行POST。有效負載進入消息正文,而不是查詢字符串。