0

对于 POST 请求,我收到了text/html格式的响应,响应正文包含以下信息:

oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXX&oauth_token_secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&oauth_callback_confirmed=true

我提出了这个请求System.Net.Http.HttpClient,我可以用FormUrlEncodedMediaTypeFormatteras读取响应,FormDataCollection但结果证明默认情况下FormUrlEncodedMediaTypeFormatter只支持application/x-www-form-urlencoded格式。因此,我使用以下代码解决了这个问题:

using (OAuthHttpClient client = new OAuthHttpClient(creds)) {

    var response = await client.PostAsync(requestUri, new EmptyContent());
    var formatter = new FormUrlEncodedMediaTypeFormatter();
    formatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    var result = await response.Content.ReadAsAsync<FormDataCollection>(new List<MediaTypeFormatter>() { formatter });

}

这里的问题是:

响应提供者(在这种情况下是 Twitter)是否通过将此响应作为text/html发送而做错了,还是应该默认FormUrlEncodedMediaTypeFormatter支持text/html类型?

4

2 回答 2

3

您的问题缺少一些关键信息,即默认情况下 requestUri 应该返回什么,它是 Web API 服务还是外部服务等。它似乎不是 Web API,因为它返回“text/html”有点奇怪。

但是 FormUrlEncodedMediaTypeFormatter 不支持从 text/html 格式化回来的事实绝对没问题。因为为什么会这样?“application/x-www-form-urlencoded”实际上是一个键值字典,而 text/html 是一种富媒体类型。

在 Web API 中,通过内容协商的工作方式,它着眼于

  1. 媒体类型映射(我假设在您的情况下不存在)
  2. 接受标头 - 查看您的请求,您没有设置它们
  3. 请求内容类型 - 再次查看您的请求,您没有设置它,所以它是空的
  4. 格式化程序可以序列化给定类型吗

因此,如果您向任何 Web API 操作显示请求,它将返回 text/xml(如果您没有手动调整 conneg)。

于 2012-07-29T14:15:39.670 回答
3

我同意 Filip 的观点,认为这是解决不正确的内容类型标题的好方法。

亨里克

于 2012-07-29T20:59:42.067 回答