带有JSON主体的DotNetOpenAuth POST示例

时间:2011-05-31 19:39:11

标签: .net wcf rest dotnetopenauth

我正在使用DotNetOpenAuth并尝试将JSON对象发布到服务器。

服务器正在抛出WebContentType = Raw错误。

Authorization: OAuth
oauth_token="V9vVXD51ehUU6WmY%2FQ41qta0RfY%3D",oauth_consumer_key="CHiawRiAb299cOas",oauth_nonce="BBTM4csg",oauth_signature_method="HMAC-SHA1",oauth_signature="KZJZvT630f2KenB9l9tqSLI%2FfHA%3D",oauth_version="1.0",oauth_timestamp="1306870331"
Content-Type: application/x-www-form-urlencoded; charset=utf-8 
User-Agent: DotNetOpenAuth/3.4.6.10357

我想我真的在寻找一个如何做到这一点的例子?或者是一个样本的网址?

我正在尝试

WebRequest httpRequest = consumer.
    PrepareAuthorizedRequest(endpoint, AccessToken, para);
httpRequest.ContentType = "application/json";
WebResponse webResponse = httpRequest.GetResponse();

3 个答案:

答案 0 :(得分:3)

原来answered by iain

好的,我设法解决了这个问题。我发现的问题是我从PrepareAuthorizedRequest调用了ConsumerBase。之后,内容类型不受尊重,并始终标记为x-www-form-urlencoded。为了解决这个问题,我正常调用了PrepareAuthorizedRequest,然后创建了一个新的HttpWebRequest,并在OAuth Authorization标题中进行了复制。

HttpWebRequest httpRequest = consumer.
    PrepareAuthorizedRequest(endpoint, AccessToken);

HttpWebRequest httpWebRequest = (HttpWebRequest)
    WebRequest.Create(serviceBase + "/Edit/6363241");

foreach (string headerKey in httpRequest.Headers.AllKeys)
    httpWebRequest.Headers.Add(headerKey, httpRequest.Headers[headerKey]);


httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";

using (Stream requestStream = httpWebRequest.GetRequestStream())
{
    byte[] bytes = Encoding.UTF8.GetBytes(test22);
    requestStream.Write(bytes, 0, bytes.Length);
}

WebResponse webResponse = httpWebRequest.GetResponse();

string responseContent = new StreamReader(webResponse.GetResponseStream()).
    ReadToEnd();

答案 1 :(得分:1)

我相信你的错误是你将para作为第三个参数传递给PreparedAuthorizedRequest。如果你传入的是extraParameters,那么你告诉DotNetOpenAuth这些额外的参数必须包含在消息有效载荷中,这需要特定的内容类型。如果你只是传递null作为第三个参数,我认为你可以避免所有这些标题复制并使用你自己的自定义内容类型。

答案 2 :(得分:1)

您需要在获取请求流之前通过Content-Length属性设置httpRequest.ContentLength标头。

此外,虽然你已经拥有它,但我搜索了几个小时,试图找出我遗漏的内容,这是HttpDeliveryMethods.AuthorizationHeaderRequest声明中的endpoint

string url = serviceBase + "/Booking/6363241";
HttpDeliveryMethods methods = HttpDeliveryMethods.PostRequest | HttpDeliveryMethods.AuthorizationHeaderRequest;
MessageReceivingEndpoint endpoint = new MessageReceivingEndpoint(url, methods);
WebRequest httpRequest = consumer.PrepareAuthorizedRequest(endpoint, AccessToken);
httpRequest.ContentType = "application/json";

byte[] bytes = Encoding.UTF8.GetBytes(test22);
httpRequest.ContentLength = bytes.Length;

using (Stream requestStream = httpRequest.GetRequestStream())
{
    requestStream.Write(bytes, 0, bytes.Length);
}

string responseContent;
using (HttpWebResposne response = (HttpWebResponse)httpRequest.GetResponseStream())
using (StreamReader reader = new StreamReader(response))
{
    responseContent = reader.ReadToEnd();
}