C#HttpWebRequest类型为“application / x-www-form-urlencoded” - 如何发送'&'内容体中的人物?

时间:2011-04-14 15:23:45

标签: c# post httpwebrequest

我正在用C#编写一个小型API连接的应用程序。

我连接到一个API,它有一个带长字符串的方法,即日历(ics)文件的内容。

我这样做:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
request.Method = "POST";
request.AllowAutoRedirect = false;
request.CookieContainer = my_cookie_container;
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.ContentType = "application/x-www-form-urlencoded";

string iCalStr = GetCalendarAsString();

string strNew = "&uploadfile=true&file=" + iCalStr;

using (StreamWriter stOut = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII))
 {
     stOut.Write(strNew);
     stOut.Close();
 }

这似乎很有效,直到我在日历中添加一些特定的HTML。

如果我有一个'& nbsp'在我的日历(或类似)中的某个地方,服务器只获取所有数据到达'' - 点,所以我假设'&'在此点属于新参数后,它看起来像什么?

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:34)

首先安装“Microsoft ASP.NET Web API Client”nuget包:

  PM > Install-Package Microsoft.AspNet.WebApi.Client

然后使用以下函数发布您的数据:

public static async Task<TResult> PostFormUrlEncoded<TResult>(string url, IEnumerable<KeyValuePair<string, string>> postData)
{
    using (var httpClient = new HttpClient())
    {
        using (var content = new FormUrlEncodedContent(postData))
        {
            content.Headers.Clear();
            content.Headers.Add("Content-Type", "application/x-www-form-urlencoded");

            HttpResponseMessage response = await httpClient.PostAsync(url, content);

            return await response.Content.ReadAsAsync<TResult>();
        }
    }
}

这是如何使用它:

TokenResponse tokenResponse = 
    await PostFormUrlEncoded<TokenResponse>(OAuth2Url, OAuth2PostData);

TokenResponse tokenResponse = 
    (Task.Run(async () 
        => await PostFormUrlEncoded<TokenResponse>(OAuth2Url, OAuth2PostData)))
        .Result

或(不推荐)

TokenResponse tokenResponse = 
    PostFormUrlEncoded<TokenResponse>(OAuth2Url, OAuth2PostData).Result;

答案 1 :(得分:24)

由于您的内容类型为application/x-www-form-urlencoded,因此您需要对POST正文进行编码,特别是如果它包含&等字符,这些字符在表单中具有特殊含义。

尝试将字符串传递给HttpUtility.UrlEncode,然后再将其写入请求流。

以下是一些供参考的链接。

答案 2 :(得分:8)

只要服务器允许对ampresand字符进行POST(并非所有操作都不安全),您只需要对URL进行编码。对于放大器,您应该用%26替换该字符。

.NET为您提供了一种很好的编码整个字符串的方法:

string strNew = "&uploadfile=true&file=" + HttpUtility.UrlEncode(iCalStr);