在RTC上向创建工厂发送邮件,但收到'GET'响应

本文关键字:响应 GET RTC 创建 工厂 | 更新日期: 2023-09-27 18:10:09

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

我有一个web请求设置和配置:

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而是返回一个门票列表,我只能在某个地方得出结论,我的请求被视为'GET'。

作为测试,我将请求改为使用PUT而不是POST。这是不允许在创建工厂URL上使用的,并且在测试中确实会抛出错误。所以我很生气,为什么RTC不创建我的票,而是把我的请求作为GET处理,并返回一个票列表。

有人有什么想法吗?

谢谢。

在RTC上向创建工厂发送邮件,但收到'GET'响应

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

关于表单身份验证的jazz.net信息说:"身份验证成功后,您总是必须至少重播一次原始请求才能访问受保护的资源。"如果第一次重播导致另一组重定向,并且原始请求具有非get方法,则可能需要更多的重播。"

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

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

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