【发布时间】:2013-09-15 08:15:15
【问题描述】:
我正在 C#/.NET 中实现 Recurly API (http://docs.recurly.com/api),尽管 V2 缺乏 .NET 支持,但到目前为止它运行良好。
我已成功实现大部分 API,但在使用 PUT 请求修改或更新用户帐户时遇到问题。
我的 GET 和 POST 请求完美运行,我收到 httpStatusCode 200 用于创建帐户,并为我“GET”的任何数据收到适当的 XML。
但是,例如,当我尝试使用 PUT 请求重新激活订阅时,Recurly 中的订阅确实会按请求重新激活,但我得到的响应是 http 状态代码 500:
The server encountered an error while processing your request and failed.
我相信这个问题与下面定义request.ContentLength = 0;的代码有关
但随后没有在请求中指定或发送实际的内容主体。
在定义 ContentLength = 0 之前,订阅不会重新激活,我会收到 411 Length Required 错误(因此我添加了内容长度)。
文档没有说明在 PUT 请求中指定任何实体(我认为这是正确的术语),只是将 a put 请求发送到适当的 URI。
我陷入了僵局,并尝试将一个空白字符串、XML 文件(重新创建订阅详细信息)与请求一起发送,但我似乎只返回了错误。
我不知所措,因为我不知道 Recurly 在 PUT 请求中的实体方面想要什么,只要定义了 ContentLength,它就可以在没有实体的情况下工作,这对我来说没有多大意义我的印象是 PUT 和 POST 一样需要一个主体,尽管在做了一些研究后我发现有些人提到这可能没有必要。
我只是无法在我的其余代码中获得验证所需的响应 (httpStatusCode 200),尽管实际请求在 Recurly 中工作。
是否可以发送内容长度为 0 的空白字符串或空正文而不会出现服务器错误,或者我是否需要以某种方式找到要发送给 Recurly 的内容,请求返回可接受的响应状态代码,尽管后者似乎是多余的,因为订阅无论如何都会重新激活。
uri = "https://" + subdomain + ".recurly.com/v2/subscriptions/" + uuid + "/reactivate";
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Headers.Add("Authorization", "Basic " + encodeB64);
request.Method = "PUT";
request.ContentType = "text/XML";
request.ContentLength = 0;
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
编辑:我尝试过的其他示例
uri = "https://" + subdomain + ".recurly.com/v2/subscriptions/" + uuid + "/reactivate";
try
{
string xml = "<subscription><timeframe>now</timeframe></subscription>"; //also tried with blank string.
byte[] arr = System.Text.Encoding.UTF8.GetBytes(xml);
HttpWebRequest renewRequest = (HttpWebRequest)WebRequest.Create(uri);
renewRequest.Headers.Add("Authorization", "Basic " + encodeB64);
renewRequest.Method = "PUT";
renewRequest.ContentType = "text/XML";
renewRequest.ContentLength = arr.Length;
Stream datastream = renewRequest.GetRequestStream();
datastream.Write(arr, 0, arr.Length);
datastream.Close();
HttpWebResponse renewResponse = (HttpWebResponse)renewRequest.GetResponse();
}
附带说明,我是 C# 新手,因此在学习期间对 C# 的了解有限,所以请耐心等待!
谢谢
【问题讨论】: