0

相关:DotNetOpenAuth 我需要在 FetchResponse 中发送长字符串和 DotNetOpenAuth 中的OpenId查询长度问题?- 但这些都不能令人满意地回答我的问题。

我们正在使用 DotNetOpenAuth 将数据发布到Xero,它支持每个请求最大 3MB。我们正在尝试在以下位置发布一个 77Kb XML 字符串requestBody

Dictionary<string, string> additionalParams = new Dictionary<string, string>();
additionalParams.Add("xml",requestBody);

var endpoint = new MessageReceivingEndpoint(requestURL, HttpDeliveryMethods.PostRequest | HttpDeliveryMethods.AuthorizationHeaderRequest);
HttpWebRequest request = XeroConsumer.PrepareAuthorizedRequest(endpoint, accessToken, additionalParams);

WebResponse response = request.GetResponse();
string thisResponse = (new StreamReader(response.GetResponseStream())).ReadToEnd();

PrepareAuthorizedRequest正在投掷:Invalid URI: The Uri string is too long.

有什么方法可以使用 DotNetOpenAuth 发布“大”数据?

4

1 回答 1

1

DotNetOpenAuth 使用Uri.HexEscape()Uri.EscapeDataString()附加参数。当您的参数长度超过 2Kb 时,这会中断。

我已经将它们的功能换成了我自己的低效但有效的功能:

    internal static string EscapeUriDataStringRfc3986(string value)
    {
        StringBuilder escaped = new StringBuilder();

        string validChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~";

        foreach (char c in value)
        {
            if(validChars.Contains(c.ToString())){
                escaped.Append(c);
            } else {
                escaped.Append("%" + Convert.ToByte(c).ToString("x2").ToUpper());
            }
        }

        // Return the fully-RFC3986-escaped string.
        return escaped.ToString();
    }
于 2013-09-18T23:31:07.290 回答