2011-04-14 170 views
22

我正在用C#编写一个小的API连接应用程序。类型为“application/x-www-form-urlencoded”的C#HttpWebRequest - 如何在内容主体中发送'&'字符?

我连接到一个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”在我的日历(或类似)服务器只得到所有的数据到“&‘ - 点的地方,所以我假设’&”使它看起来像什么此点后属于一个新的参数?

我该如何解决这个问题?

+0

编码发送之前的字符串? – 2011-04-14 15:29:50

+0

用%26替换&? – 2011-04-14 15:30:38

回答

8

只要服务器允许ampresand字符公布(不是所有的事,因为它可以是不安全的),你应该做的是URL编码字符。在ampresand的情况下,您应该用%26替换该字符。

.NET提供编码虽然整个字符串为您的一个很好的方式:

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

首先安装“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; 
相关问题