【问题标题】:c# HttpWebRequest.GetRequestStream Authorizationc# HttpWebRequest.GetRequestStream 授权
【发布时间】:2016-02-15 14:49:23
【问题描述】:

我有一个带有 Authorize 标签的 Web Api 控制器。 https://msdn.microsoft.com/de-de/library/system.web.http.authorizeattribute(v=vs.118).aspx

[Authorize()]
public class SomeController : ApiController {}

我正在使用 HttpWebRequest 对该控制器执行 Post-Request,如下所示: (请注意,我没有提供授权标头来显示我的问题)

var httpWebRequest = (HttpWebRequest)WebRequest.Create("SomeUrl");
httpWebRequest.ContentType = "text/json";
httpWebRequest.Method = "POST";

StreamWriter streamWriter;

// 1) no error here, works without authentication
using (streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
    string json = "{\"Message\":\"Test\"," + "\"Data\":\"\"}";

    streamWriter.Write(json);
    streamWriter.Flush();
    streamWriter.Close();
}


// 2) here I get a 401: not authorized
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

问题: 在请求请求流时,我希望得到一个未经授权的异常。但我可以调用 GetRequestStream 甚至写入该流,没有任何问题。 只有在调用 GetRespone 时,我才会收到我之前预期的 401(未授权)。

我只是想知道,这是否是预期的行为?如果有任何方法可以改变它。例如,如果我要上传一个巨大的文件,在通知客户端无权这样做之前,所有数据都会被上传。不知何故,这对我来说没有意义?还是我错过了什么?

【问题讨论】:

  • 这是预期的行为。只有在您实际提出请求后,您才会得到响应。 HTTP 不维护任何状态,这意味着您无法提前获取任何信息。
  • 但是当我调用 GetRequestStream 时,我实际上已经创建了与服务器的连接并发送了请求标头。当我写入流时,我已经将数据上传到服务器(或没有?)。在未经授权的情况下这样做似乎令人困惑。 HttpClient 的做法不同。例如 HttpClient.PostAsJsonAsync 不会上传任何数据并会立即拒绝请求。所以我觉得还不是很清楚。

标签: c# http-post httpwebrequest asp.net-authorization


【解决方案1】:

您是对的,理想情况下,GetRequestStream() 调用应该导致请求被发送到服务器,并且服务器以 401 响应。

我认为可能发生的情况是服务器在回复最终状态之前正在等待您发布数据。这就是为什么您在调用 request.GetResponse() 时会得到最终响应

在任何情况下,您都应该处理异常并做必要的事情。

【讨论】:

  • 好的,谢谢,我认为发送整个邮件正文然后被拒绝是荒谬的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 2019-01-28
相关资源
最近更新 更多