0

我遇到了一些奇怪的行为,我很确定这与我的代码有关,而不是与我正在使用的 RTC 实例有关。

我有一个网络请求设置和配置:

var cookies = new CookieContainer();
var request = (HttpWebRequest)WebRequest.Create(getCreationFactoryUri);
var xmlString = getRDF.ToString();

request.CookieContainer = cookies;
request.Accept = "application/rdf+xml";
request.Method = "POST";    
request.ContentType = "application/rdf+xml";
request.Headers.Add("OSLC-Core-Version", "2.0");
request.Timeout = 40000;
request.KeepAlive = true;
byte[] bytes = Encoding.ASCII.GetBytes(xmlString);
request.ContentLength = bytes.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(bytes, 0, bytes.Length);
dataStream.Close();

这将传递给基于 RTC 示例编写的另一个方法,该示例使用 RTC 的表单身份验证。

在 OSLC v2 规范下,我使用创建工厂 URL 发布到。我知道 URL 很好,因为我已经在 Firefox 中使用 RESTClient 设置了一个调用。添加了所需的标头(Content-Type:application/rdf+xml,Accept:application/rdf+xml,OSLC-Core-Version:2.0)并使用了我的代码试图传递的生成的 XML。我的手动呼叫运行良好,并且创建了票证。

在我的日志中,我捕获了来自 RTC 的响应,这是一个工单列表,而不是显示我的工单已创建的响应。我可以通过对用于创建事件票的创建工厂 URL 执行 GET 来重新创建此行为。

因此,尽管我知道我正在向创建工厂发送 POST(我进行了调试以检查我的 Web 请求方法是否 100% 设置为“POST”),但 RTC 却返回了一个工单列表,我只能在某个地方得出结论,我的请求得到了处理作为“获取”。

作为测试,我将请求更改为使用 PUT 而不是 POST。这不允许在创建工厂 URL 上使用,并且在测试时确实会引发错误。所以我完全不明白为什么 RTC 不创建我的票,而是将我的请求视为 GET 并返回一张票列表。

有人有想法么?

谢谢。

4

1 回答 1

2

如果服务器使用表单身份验证,如您所说,那么我预计正在发生的事情是 POST 导致 HTTP 重定向到身份验证表单。即使您的其他代码正在处理该身份验证(听起来确实如此),该身份验证的结果也将是 HTTP 重定向到原始请求的 URL。但是,该重定向可能会导致对该 URL 的 GET,而不是原始 POST。(另外,如果您的请求是多线程的,我不相信身份验证后的重定向是 100% 可靠的)。

jazz.net 有关表单身份验证的信息说“身份验证成功后,您始终必须至少重播一次原始请求才能到达受保护的资源。如果第一次重播导致另一组重定向和原始请求,则可能需要更多重播。请求有一个非 GET 方法。”

因此,如果您的代码收到身份验证质询,您将需要重新发送原始 POST。

我相信您浏览器中的 RESTClient 插件第一次工作的原因是它正在将您之前登录的 cookie 发送到浏览器中的 RTC Web UI。(我最近有过这样的经历,也觉得很困惑)。

此外,如果您没有在客户端应用程序中的 RTC 请求之间保留 cookie,那么您将遇到每个请求的身份验证挑战。如果您在来自客户端应用程序的调用之间保留 cookie(您的操作方式将取决于您的客户端库 - 我不熟悉您示例中的代码),那么我的经验是您不会收到每个请求的身份验证挑战. (但是,您仍然需要能够处理每个请求的身份验证挑战 - 包括 POST - 否则如果会话在您发送 POST 之前超时,它可能会间歇性地失败)。

于 2015-09-10T15:08:37.180 回答